csv 파일의 마지막 열(또는 숫자 값이 있는 다른 열)을 기준으로 정렬

csv 파일의 마지막 열(또는 숫자 값이 있는 다른 열)을 기준으로 정렬

다음 내용이 포함된 파일이 있습니다. 행의 나머지 부분을 유지하면서 마지막 열(마지막 열에서 세 번째 열, 다른 파일의 경우)을 기준으로 파일을 정렬하고 싶습니다.

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
                       _____
____________________________

여기서 정렬은 필드 사이의 구분 기호로 쉼표를 사용하고 이전 단계에서 마지막 필드인 특정 필드를 기준으로만 정렬하는 것입니다.

그런데, 귀하의 질문은 의심할 여지 없이 이전에 질문되고 답변되었기 때문에 종료될 가능성이 높습니다.

관련 정보