csv 파일이 있고 셸로 읽을 때 데이터는 다음과 같습니다.
name,income,reward,payment
Jackson,10000,2000,1000
Paul,2500,700,200
Louis,5000,100,1800
저는 "순소득 = 소득 + 인센티브 지급"이라는 공식을 사용하여 각 개인의 순소득을 찾고 싶습니다.
명령을 사용하여 이 작업을 수행하면 데이터의 첫 번째 행만 계산됩니다.
$ cat data.csv | awk -F ',' '{for (i=1;i<=NF;i++) net[i] = $2+$3-$4} END {for (p in total) print p, "net = ", net[p]}' > result.txt
여기서는 어떻게 계산하나요?
그런데 이름이 고유하지 않아서 배열[net]에 대한 인덱스를 생성하려고 for 루프를 시도했습니다.
내 예상 결과는 다음과 같습니다
1 Jackson net = 11000
2 Paul net = 3000
3 Louis net = 3300
답변1
$ awk -F, -v OFS=, 'NR>1 { print $1, $2+$3-$4 }' data.csv
Jackson,11000
Paul,3000
Louis,3300
또는 (업데이트된) 헤더 행과 함께 기존 데이터에 네트워크를 추가하려는 경우:
$ awk -F, -v OFS=, 'NR==1 {print $0,"net"}; NR>1 {print $0, $2+$3-$4}' data.csv
name,income,reward,payment,net
Jackson,10000,2000,1000,11000
Paul,2500,700,200,3000
Louis,5000,100,1800,3300
답변2
이 방법:
$ awk 'BEGIN{ FS=OFS="," } { $5=NR>1?$2+$3-$4:"net" }1' infile
name,income,reward,payment,net
Jackson,10000,2000,1000,11000
Paul,2500,700,200,3000
Louis,5000,100,1800,3300
또는 예상 출력을 업데이트하십시오.
$ awk -F, 'NR>1{ print NR-1, $1, "net= " $2+$3-$4 }' ifnile
1 Jackson net= 11000
2 Paul net= 3000
3 Louis net= 3300
답변3
사용 awk
:
awk -F',' '{ p[NR] = $1;net[NR] = $2+$3-$4} END {for (i=2;i<=NR;i++) print (i-1), p[i], "net = ", net[i]}' data.csv
이것은 csv
파일 이기 때문에 FS = ','
또는-F ','
p
다음으로 배열을 만듭니다 net
. 이는 NR(레코드 번호)에 색인되어 있습니다.
그러면 for 루프가 (i-1), p[i], "net = ", net[i]
계획한 대로 작동할 것입니다.
for
첫 번째 행이 헤더 행이므로 루프는 2에서 시작됩니다.
pipe
이 경우에는 쓸모가 없습니다. 또 다른 점은 루프는 괜찮지만 제한 NR
이 NF
.