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