내용이 다음과 같은 파일이 있습니다.
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]