두 열 간의 차이 계산

두 열 간의 차이 계산

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 '{ print $2 - $3 }' filename.csv

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

0
0
0
0

예상 출력 파일:

"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"

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

답변1

awk의 기본 구분 기호는 공백이지만 csv는 따옴표와 쉼표를 사용하므로 awk는 기본적으로 csv 파일을 하나의 큰 열로 처리합니다.

또한 숫자를 인식하려면 따옴표를 제거해야 합니다. 따라서 -F'","'구분 기호를 쉼표로 구분된 인용 문자열로 변경할 수 있습니다. 이는 인용 문자열에 쉼표만 포함되지 않는 한 작동합니다.

awk -F'","'  '{ print $2 - $3 }' filename.csv

셸을 인용해야 합니다.

답변2

이것은 작동합니다:

$ awk 'BEGIN{FS=OFS="\""}{$7=",\""$4-$6"\""}1' filename.csv

산출:

"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"

서술자로서,만약에숫자 필드는 인용되지 않으므로 훨씬 간단합니다 awk -F, '{$4=$2-$3}1' filename.csv.

답변3

사용행복하다(이전 Perl_6)

raku -MText::CSV -e 'my @a = csv(in => "/Path/To/File");  \
      my @b = @a.map(*.[1]) Z- @a.map(*.[2]); \ 
     .put for @a Z @b;'

#OR

raku -MText::CSV -e 'my @a = csv(in => "/Path/To/File");  \
      .put for @a Z (@a.map(*.[1]) Z- @a.map(*.[2]));' 

입력 예:

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

예제 출력:

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

(소규모 프로젝트의 경우) csv를 직접 구문 분석할 수 있다고 확신하지만 어떤 시점에서는 CSV 파서를 사용하는 것이 합리적일 수 있습니다(삽입된 따옴표 처리, 삽입된 개행 처리, 쉼표/쉼표가 아닌 열 구분 기호 감지/변경, 공백 자르기). , 등.).

bashRaku 프로그래밍 언어의 명령줄에서 CSV 파서를 호출하는 것이 얼마나 쉬운지 알면 놀랄 것입니다. 먼저 Text::CSV(모듈) 명령줄 플래그를 사용하여 모듈을 로드하면 .-M-MText::CSV-e

첫 번째 예를 설명하기 위해 @a배열을 선언 my하고 csv 입력을 받습니다. 열 1과 열 2의 차이를 취하는(0 인덱스) @b배열을 선언합니다 . my이러한 차이는 Zmake를 위해 zip 메타 연산자에 빼기 연산자를 추가함으로써 달성 됩니다 Z-. 마지막으로 Zzip 메타 연산자를 사용하여 @a열별로 압축된 원본 csv를 출력합니다 @b.

https://github.com/Tux/CSV/blob/master/doc/Text-CSV.pdf(다운로드 링크를 클릭하세요)
https://docs.raku.org/언어/operators#index-entry-Z_(zip_metaoperator)
https://raku.org

답변4

사용밀러( mlr)는 헤더 없는 CSV 파일을 읽고, 두 번째 필드와 세 번째 필드 간의 차이를 계산하여 새로운 네 번째 필드를 생성하고, 표준 형식 지정자에 따라 결과 부동 소수점 값의 형식을 지정하고 %g, CSV 따옴표를 사용하여 출력합니다.

$ mlr --csv -N --quote-all put '$4 = fmtnum($2 - $3, "%g")' file
"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"

Miller의 후속 버전에서는 형식이 손상된 것으로 나타나 므로 %g유사한 %.6g.

관련 정보