여러 열 정렬

여러 열 정렬

내용이 다음과 같은 파일이 있습니다.

19.58 1925 Alpha
20.40 1924 Otter
13.66 1920 Gold

다음을 출력하기 위해 "열 기준"으로 정렬하려고 합니다.

13.40 1920 Alpha
19.58 1924 Gold
20.66 1925 Otter

다음과 같은 다양한 코드 조합을 시도했습니다.

cat files | sort -t. -k1,1n | sort -t " " -k2,2n -k3,3r k4,4n

그러나 이는 원하는 결과를 출력하지 않습니다. 내가 언급한 정렬을 어떻게 달성할 수 있나요?

답변1

printf "%s.%s %s %s\n" $(paste <(awk -F'[. ]' '{print $1}' file | sort -n) <(awk -F'[. ]' '{print $2}' file | sort -n) <(awk -F'[. ]' '{print $3}' file | sort -n) <(awk -F'[. ]' '{print $4}' file | sort))

산출:

1920 13.40 알파
19.58 1924년 금
20.66 1925 수달

답변2

GNU가 있는 경우 awk특수 배열의 도움을 받아 정렬을 수행할 수 있습니다 PROCINFO.

awk -F '[. ]' '{for(i=1;i<NF+1;i++) a[i][NR]=$i} \
    END{PROCINFO["sorted_in"]="@val_num_asc"; \
        for(j=1;j<NF+1;j++){ I=0; for(i in a[j]) A[++I][j]=a[j][i]} \
            for(i=1;i<NR+1;i++){ printf A[i][1]"."; \
                for(j=2;j<NF+1;j++) printf A[i][j]" "; printf "\n"}}' file

위의 코드는 언뜻 보면 복잡해 보일 수 있지만 실제로는 매우 간단합니다. 전체 파일을 배열에 저장하고 a마지막으로 A필요에 따라 배열을 사용합니다. 주요 트릭은 @val_num_asc숫자 오름차순으로 열을 정렬하려고 할 때 사용됩니다.

행과 열 수에 관계없이 작동해야 합니다. 전체 파일이 메모리에 저장되므로 큰 테이블의 경우 속도가 느려질 수 있다는 점만 기억하세요.

답변3

#!/bin/sh

for i in 1 2 3 4
do
    tr . " " < "${1:?}" | cut -d' ' -f$i | sort > $$-$i
done

paste -d. $$-[12] | paste -d' ' - $$-[34]

rm $$-[1234]

관련 정보