다음 내용이 포함된 파일이 있습니다.
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
이제 입력의 헤더를 사용하고 출력에서 생성하려고 하므로 이 옵션을 제거했습니다 .