awk에서 여러 열의 누적 합계를 얻는 방법은 무엇입니까?

awk에서 여러 열의 누적 합계를 얻는 방법은 무엇입니까?

다음과 같이 파이프로 구분된 파일이 있습니다.

KALPESH|100|200|300
KALPESH|200|300|400
KALPESH|300|400|500
KALPESH|400|500|600

나는 다음을 사용하고 있습니다 :

awk -F"|" '{ name[$1]+=$2 } END { for (c in name) print c"|"name[c] }' earning1

그러면 열 2에 대한 결과가 제공됩니다. 예를 들면 다음과 같습니다.

KALPESH|1000

각 열에 대해 이 작업을 수행한 다음 join명령을 사용해야 하지만 3개 열 모두에 대한 누적 합계를 원합니다. 예를 들면 다음과 같습니다.

KALPESH|1000|1400|1800

단일 awk로 이것이 달성될 수 있습니까?

답변1

이와 같은 작업에는 다음과 같은 보다 전문적인 도구를 선호합니다.datamash

$ datamash -t '|' -g 1 sum 2 sum 3 sum 4 < file
KALPESH|1000|1400|1800

또는 csvsql도구csvkit:

$ csvsql -H -d'|' --query '
    select a,sum(b),sum(c),sum(d) from file group by a' file | csvformat -D'|'

a|sum(b)|sum(c)|sum(d)
KALPESH|1000|1400|1800

답변2

datamash나는 원칙적으로 @plumo를 사용하겠지만 OP 요청을 고수하고 친구가 있다고 awk가정하므로 입력 파일은 다음과 같습니다.KALPESHRAJESH

KALPESH|100|200|300
KALPESH|200|300|400
RAJESH|300|400|500
RAJESH|400|500|599
KALPESH|300|400|500
KALPESH|400|500|600
RAJESH|100|200|300
RAJESH|200|300|400

그 다음에

awk -F\| '{
    flds=(NF>flds)?NF:flds; 
    nm[$1]=$1;
    for (f=2; f<=NF; f++) sum[$1"|"f]+=$f
  }END{
    for (n in nm) {printf "%s", n;
      for (f=2; f<=flds; f++) printf "%s", FS sum[n"|"f]; print""
  }
}' file

KALPESH|1000|1400|1800
RAJESH|1000|1400|1799

KALPESH별개이고 필드 수가 일정한 경우 이는 다음과 같이 축소됩니다.

awk -F\| '{
    for (f=2; f<=4; f++) sum[f]+=$f
  }END{
    printf "%s", "KALPESH";
      for (f=2; f<=4; f++) printf "%s", FS sum[f]; print""
  }' file

아니면 심지어

awk -F\| '{s2+=$2; s3+=$3; s4+=$4}END{print "KALPESH" FS s2 FS s3 FS s4}' file

답변3

그렇게 생각해요. awk에 대해 많이 알지 못해도 변수를 사용하여 두 번째 열의 합계를 추적하여 본문에서 이 작업을 수행할 수 있습니다.이름확장하여 모든 열의 합계를 계산할 수 있습니다. 아이디어 제공: 시도해 보고 필요에 맞게 조정

awk -F"|" '{ total1 += $2; total2 += $3} END { print (total1, total2); }' earnings

정확히 무엇을 원하는지 명확하지 않습니다. 열 1의 내용이 중요합니까? 발생하는 모든 이벤트에 대한 총 개수가 있어야 합니까, 아니면 항상 동일해야 합니까? 해결책은 그러한 것들에 달려 있습니다. 어려움에 직면하면 알려주시기 바랍니다.

관련 정보