네 번째 열을 기준으로 정렬

네 번째 열을 기준으로 정렬

filename.csv다음 내용이 포함된 CSV 파일이 있습니다.

파일 이름.csv:

"Afghanistan","94.0","81.1"
"Bahamas","42.9","43.2"
"Bolivia (Plurinational State of)","86.7","31.9"
"Brazil","76.7","0.0"

두 열(열 2 - 열 3) 간의 차이를 계산하고 출력을 네 번째 열에 붙여넣고 싶습니다. 그런 다음 네 번째 열을 기준으로 숫자를 정렬하고 싶습니다. 그러나 내가 사용하는 명령은 네 번째 열을 기준으로 정렬되지 않습니다.

내가 사용한 명령은 다음과 같습니다.awk -F'","' '{ print $0, $2 - $3 }' filename.csv | sort -k4 -n

내가 얻는 결과는 다음과 같습니다.

"Afghanistan","94.0","81.1" 12.9
"Bahamas","42.9","43.2" -0.3
"Bolivia (Plurinational State of)","86.7","31.9" 54.8
"Brazil","76.7","0.0" 76.7

예상 출력 파일:

"Bahamas","42.9","43.2","-0.3"    
"Afghanistan","94.0","81.1","12.9"
"Bolivia (Plurinational State of)","86.7","31.9","54.8"
"Brazil","76.7","0.0","76.7"

도움을 주시면 감사하겠습니다. 감사해요!

답변1

당신이 겪고 있는 문제는 [sort]가 공백이 아닌 공백에서 공백으로의 변환을 필드 변환으로 이해하고 -t를 사용하여 필드 구분 기호를 정의하지 않았기 때문에 "," 대신 기본값을 사용한다는 것입니다. 그러나 awk 에 ","를 포함하는 것을 잊었으므로 다음과 같이 변경하면:

awk -F'","' '{ print $0, $2 - $3 }' filename.csv| sort -k2 -n

당신은 얻을 것이다:

"Bahamas","42.9","43.2" -0.3
"Bolivia (Plurinational State of)","86.7","31.9" 54.8
"Afghanistan","94.0","81.1" 12.9
"Brazil","76.7","0.0" 76.7

그러나 이는 쉼표 문제로 인해 예상한 것과 다르며 다음을 통해 해결됩니다.

awk -F'","'  'BEGIN {IFS=OFS=","}{ print $0, $2 - $3 }' entrada | sort -k4 -n -t","

예상 결과를 얻으십시오.

"Bahamas","42.9","43.2",-0.3
"Afghanistan","94.0","81.1",12.9
"Bolivia (Plurinational State of)","86.7","31.9",54.8
"Brazil","76.7","0.0",76.7

CSV는 텍스트 필드 내에 쉼표가 있는 경향이 있고 이를 방지하기 위해 또 다른 구문 분석을 수행한 다음 다른 OFS를 생성하고 정렬에 사용해야 하는 필드를 참조하여 처리되므로 이 접근 방식을 사용하는 것을 약간 꺼려합니다. OFS를 이전 쉼표로 되돌립니다.

화타이

답변2

대신 공백을 사용하도록 OFS를 사용하여 출력 필드 구분 기호를 지정하는 것이 좋습니다 ,. 그런 다음 -t정렬 옵션을 사용하여 필드 구분 기호를 지정할 수 있습니다.

awk -F'","'  'OFS=","{ print $0,$2-$3 }' filename.csv | sort -t ',' -k4 -n

관련 정보