다음 내용이 포함된 파일이 있습니다. 행의 나머지 부분을 유지하면서 마지막 열(마지막 열에서 세 번째 열, 다른 파일의 경우)을 기준으로 파일을 정렬하고 싶습니다.
ABC,DEF,GHI,-5,-8,-0.6,0.488
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
이 명령을 사용하면 예상대로 작동하고 올바른 결과가 표시됩니다.
awk '{print $NF,$0}' FILE | sort -nr | cut -f2- -d' '
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
ABC,DEF,GHI,-5,-8,-0.6,0.488
그러나 더 큰 파일에서 동일한 명령을 실행하면 잘못된 결과가 발생합니다. (정렬하려는 파일에는 4M 줄이 있습니다.) 다음을 입력하세요.
ABC,DEF,GHI,-5,-8,-0.6,0.0488
XYZ,JKL,MNO,3,-5,0.2,-0.0342
STU,WXY,DEF,-1,4,0.01,0.0345
JKL,JKL,GHI,-2,-3,0.31,-0.0524
QRS,GHI,YUT,-3,-1,0.20,-0.0503
HUR,JTL,ZST,1,1,0.52,-0.0556
FTT,JL,MKI,0,2,0.21,-0.0529
FTC,JKL,ERW,-1,6,0.23,-0.0441
HJI,MHP,VGT,1,-6,0.80,-0.0433
BUT,IOP,HGT,2,2,0.2,-0.0439
XYZ,BGY,MNO,-2,1,0.01,-0.0416
답변1
얼마나 많은 필드가 있는지 알고 있는 경우:
$ sort -t, -k7,7n file
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
ABC,DEF,GHI,-5,-8,-0.6,0.488
또는 그렇지 않은 경우:
$ awk 'BEGIN{FS=OFS=","} {print $NF,$0}' file | sort -t, -k1,1n | cut -d, -f2-
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
ABC,DEF,GHI,-5,-8,-0.6,0.488
마지막 필드 대신 마지막에서 세 번째 필드를 기준으로 정렬하는 것은 명백합니다.
$ awk 'BEGIN{FS=OFS=","} {print $(NF-2),$0}' file | sort -t, -k1,1n | cut -d, -f2-
ABC,DEF,GHI,-5,-8,-0.6,0.488
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
여러 행에 동일한 정렬 필드 값이 있을 때 입력 순서를 유지하려면 GNU 정렬을 사용할 수 있습니다. 그렇지 않으면 -s
행 번호를 보조 정렬 키로 포함합니다.
$ awk 'BEGIN{FS=OFS=","} {print $NF,NR,$0}' file | sort -t, -k1,1n -k2,2n | cut -d, -f3-
XYZ,JKL,MNO,3,-5,0.2,-0.342
STU,WXY,DEF,-1,4,0.01,0.345
ABC,DEF,GHI,-5,-8,-0.6,0.488
답변2
입력이 상대적으로 단순하다고 가정하면(레코드에 구분 기호가 표시되지 않음) 다음과 같이 지정된 열을 기준으로 정렬할 수 있습니다.
$ c=$(< input awk -F, 'NR==1 { print NF; exit }')
$ < input sort -t, -k $c,${c}n --debug
산출:
XYZ,JKL,MNO,3,-5,0.2,-0.342
______
___________________________
STU,WXY,DEF,-1,4,0.01,0.345
_____
___________________________
ABC,DEF,GHI,-5,-8,-0.6,0.488
_____
____________________________
여기서 정렬은 필드 사이의 구분 기호로 쉼표를 사용하고 이전 단계에서 마지막 필드인 특정 필드를 기준으로만 정렬하는 것입니다.
그런데, 귀하의 질문은 의심할 여지 없이 이전에 질문되고 답변되었기 때문에 종료될 가능성이 높습니다.