Bash에서 CSV 파일의 특정 열에 대한 산술 연산

Bash에서 CSV 파일의 특정 열에 대한 산술 연산

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

A,10,20,30,40,50
B,20,40,10,30,60
C,30,50,20,40,10
D,40,50,20,10,30

위 CSV 파일의 특정 열(예: 열 3)에 대해 일부 산술 연산(예: 10으로 나누기)을 수행하고 싶습니다. 따라서 다음과 같이 씁니다.

A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

이것이 어떻게 달성될 수 있습니까?

답변1

이 시도:

% awk -F , -v OFS=, '$3/=10' <file
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

답변2

만약 너라면진짜Bash에서 이를 수행하려면 다음을 수행하십시오.

$ while IFS="," read a b c rest; do 
    printf "%s,%s,%s,%s\n" $a $b $((c/10)) $rest; 
  done < file.csv 
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

이는 간단한 정수 연산에서는 작동하지만 bash는 부동 소수점 숫자를 처리할 수 없으므로 정수가 아닌 연산을 시도하면 실패합니다. 끔찍한. Bash는 실제로 작업에 가장 적합한 도구는 아닙니다.

답변3

Miller를 사용하여 헤더 없는 CSV 파일의 세 번째 필드에 있는 숫자를 10으로 나눕니다.

$ mlr --csv -N put '$3 /= 10' file
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

CSV 데이터에 헤더가 포함되어 있지 않아도 괜찮습니다. 그렇다면 명명된 헤더를 사용할 수 있습니다.

$ cat file
Alpha,Number,Medium,Ch,Beets,Returns
A,10,20,30,40,50
B,20,40,10,30,60
C,30,50,20,40,10
D,40,50,20,10,30
$ mlr --csv put '$Medium /= 10' file
Alpha,Number,Medium,Ch,Beets,Returns
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

-N이제 입력의 헤더를 사용하고 출력에서 ​​생성하려고 하므로 이 옵션을 제거했습니다 .

관련 정보