다음과 같이 파이프로 구분된 파일이 있습니다.
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
가정하므로 입력 파일은 다음과 같습니다.KALPESH
RAJESH
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의 내용이 중요합니까? 발생하는 모든 이벤트에 대한 총 개수가 있어야 합니까, 아니면 항상 동일해야 합니까? 해결책은 그러한 것들에 달려 있습니다. 어려움에 직면하면 알려주시기 바랍니다.