여러 열을 숫자로 정렬

여러 열을 숫자로 정렬

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 ""}'

그건:

  1. 각 셀을 한 줄로 인쇄합니다 <column-number> <value>.
  2. 정렬 기준((GNU 확장)은 as가 1을 이해하지 못함 g대신에 ) 10진수가 인식되도록 보장합니다 .nn+LC_ALL=C.
  3. 열 번호와 값이 있습니다. 그러나 테이블을 다시 작성하기 위해 여기서는 원래 숫자를 계산하고 동일한 열 번호가 나타날 때마다 이를 증가시킵니다.
  4. 우리는 raw를 기준으로 정렬한 다음 col을 기준으로 정렬하기 위해 다시 sort를 호출합니다 -s.안정적인또한 GNU 확장)
  5. 이를 처리 하여 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)
     }
   }'

-n1 For, 또는 (선택적 선행 공백 포함) 형식의 숫자만 인식됩니다. 키 값을 얻으려면 문자열의 시작 부분부터 패턴과 일치하는 부분을 가져옵니다. 따라서 의 경우 빈 문자열입니다. GNU에서는 이 모든 숫자를 인식할 수 있습니다.1231.12-12-12.34sort12e+312+12.30-gsort+1212e+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

관련 정보