600개의 열이 있는 파일을 정렬하려고 합니다. 상단에 가장 높은 숫자를 모두 표시하고 싶습니다(각 필드의 내림차순). 공백으로 구분된 파일을 분할하여 제대로 작동하는지 확인하겠습니다. 이 명령을 시도했지만 뭔가 잘못하고 있는 것 같습니다.
$ cat test.txt
+0.07273 +0.67860
-6.99580 -0.44278
-7.21295 +0.19793
$ sort -nr test.txt # (just sorted column one)
-7.21295 +0.19793
-6.99580 -0.44278
+0.07273 +0.67860
$ sort -k1,1nr -k2,2nr test.txt # (just sorted column one)
+0.0727 +0.67860
-6.99580 -0.44278
-7.21295 +0.19793
전체 열을 내림차순으로 정렬하려면 어떻게 해야 합니까? k를 600번 사용하는 것은 어렵다
답변1
다음을 수행할 수 있습니다.
<test.txt awk '{for (c = 1; c<=NF; c++) print c, $c}' |
LC_ALL=C sort -k2,2rg |
awk '{print $1, r[$1]++, $2}' |
sort -sk2,2n -k1,1n | awk '
{printf "%s", ($2 == prev ? (NR == 1 ? "" : " ") : "\n") $3; prev = $2}
END {print ""}'
그건:
- 각 셀을 한 줄로 인쇄합니다
<column-number> <value>
. - 정렬 기준값((GNU 확장)은 as가 1을 이해하지 못함
g
대신에 ) 10진수가 인식되도록 보장합니다 .n
n
+
LC_ALL=C
.
- 열 번호와 값이 있습니다. 그러나 테이블을 다시 작성하기 위해 여기서는 원래 숫자를 계산하고 동일한 열 번호가 나타날 때마다 이를 증가시킵니다.
- 우리는 raw를 기준으로 정렬한 다음 col을 기준으로 정렬하기 위해 다시 sort를 호출합니다
-s
.안정적인또한 GNU 확장) - 이를 처리 하여
awk
다시 열별로 인쇄합니다.
입력 내용을 기반으로 마지막 단계 직전에 다음이 제공됩니다.
1 0 +0.07273
2 0 +0.67860
1 1 -6.99580
2 1 +0.19793
1 2 -7.21295
2 2 -0.44278
이는 awk
다음과 같습니다:
+0.07273 +0.67860
-6.99580 +0.19793
-7.21295 -0.44278
각 열은 숫자에 따라 가장 큰 것부터 가장 작은 것까지 정렬됩니다.
perl
이제 어느 것이 더 사용하기 쉬운지 알 수 있습니다 .
+1.123
이 숫자는 기본적으로 지원됩니다..
사용자의 로케일에 관계없이 소수점 이하 자릿수 만 고려됩니다.- 정렬 및 저장 테이블이 내장된 구조(GNU
awk
도 이 작업을 수행할 수 있음)
이는 전체 입력이 메모리에 로드되어야 함을 의미합니다.
<test.txt perl -lane '
my $n; push @{$c[$n++]}, $_ for @F;
END {
@{$_} = sort {$b <=> $a} @{$_} for @c; # sort the columns in
# reverse-numerical order
for ($r = 0; $r < $.; $r++) {
print join " ", map {$c[$_]->[$r]} (0..$#c)
}
}'
-n
1 For, 또는 (선택적 선행 공백 포함) 형식의 숫자만 인식됩니다. 키 값을 얻으려면 문자열의 시작 부분부터 패턴과 일치하는 부분을 가져옵니다. 따라서 의 경우 빈 문자열입니다. GNU에서는 이 모든 숫자를 인식할 수 있습니다.123
1.12
-12
-12.34
sort
12e+3
12
+12.3
0
-g
sort
+12
12e+3
$ printf '%s\n' 1 2 10 2e3 +2 +10 inf +1 | sort -n
+1
+10
+2
inf
1
2
2e3
10
$ printf '%s\n' 1 2 10 2e3 +2 +10 inf +1 | sort -g
1
+1
2
+2
10
+10
2e3
inf