각 행에 대해 계산하는 방법

각 행에 대해 계산하는 방법

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이 경우에는 쓸모가 없습니다. 또 다른 점은 루프는 괜찮지만 제한 NRNF.

관련 정보