我有这个file.csv
"201707"|"51976551"|1|0|1|"20170702"
"201707"|"51955194"|1|0|0|"20170702"
"201707"|"51923555"|1|0|1|"20170702"
"201707"|"51976551"|1|0|1|"20170703"
"201707"|"51955194"|1|0|0|"20170703"
"201707"|"51923555"|1|0|1|"20170703"
"201707"|"51960597"|1|0|0|"20170703"
我的希望结果是按数字分组,并将第3,4和5列加在一起
"201707"|"51976551"|2|0|2
"201707"|"51955194"|2|0|0
"201707"|"51923555"|2|0|2
"201707"|"51960597"|1|0|0
我试过了:
cat file.csv | awk -F"|" '
{ a[$2] += $3 }
END {
for (i in a) {
printf "%s|%s\n", i, a[i];
}
}
'
结果是:
"51976551"|2
"51955194"|2
"51923555"|2
"51960597"|1
仅显示第三列的总和,但我需要更多列。 在这种情况下我该怎么做?
答案 0 :(得分:2)
尝试:
$ awk -F"|" '{ a[$1 OFS $2]+=$3; b[$1 OFS $2]+=$4; c[$1 OFS $2]+=$5 }
END {
for (i in a) {
print i, a[i], b[i], c[i];
}
}
' OFS=\| file.csv
"201707"|"51976551"|2|0|2
"201707"|"51960597"|1|0|0
"201707"|"51923555"|2|0|2
"201707"|"51955194"|2|0|0
-F"|"
这会将输入中的字段分隔符设置为|
。
a[$1 OFS $2]+=$3; b[$1 OFS $2]+=$4; c[$1 OFS $2]+=$5
这会跟踪第三,第四和第五列的总数。
END {
for (i in a) {
print i, a[i], b[i], c[i];
}
}
打印出结果。
OFS=\|
这告诉awk使用|
作为输出的字段分隔符。
答案 1 :(得分:1)
保留订单:
通过在END块中处理
awk 'BEGIN{
FS=OFS="|"
}
{
k = $1 OFS $2;
if(!(k in t)){
o[++c]=k;
t[k]
}
for(i=3; i<=5; i++)
a[k OFS i]+=$i
}
END{
for(i=1; i in o; i++)
{
printf "%s", o[i];
for(j=3; j<=5; j++)
printf "%s%s", OFS, a[o[i] OFS j];
print ""
}
}
' infile
或者通过两次读取相同的文件(GNU awk)
awk 'BEGIN{
FS=OFS="|"
}
function ps(f)
{
for(i=3;i<=5;i++)
if(f)
{
a[k OFS i]+=$i;
t[k]
}else
s=(s ? s OFS :"") a[k OFS i]
}
{
k=$1 OFS $2
}
FNR==NR{
ps(1);
next
}
k in t{
s="";
ps();
print k, s;
delete t[k]
}
' infile infile
输入:
$ cat input
"201707"|"51976551"|1|0|1|"20170702"
"201707"|"51955194"|1|0|0|"20170702"
"201707"|"51923555"|1|0|1|"20170702"
"201707"|"51976551"|1|0|1|"20170703"
"201707"|"51955194"|1|0|0|"20170703"
"201707"|"51923555"|1|0|1|"20170703"
"201707"|"51960597"|1|0|0|"20170703"
输出-1:
$ awk 'BEGIN{FS=OFS="|"}{k = $1 OFS $2; if(!(k in t)){o[++c]=k; t[k]} for(i=3; i<=5; i++)a[k OFS i]+=$i}END{for(i=1; i in o; i++){printf "%s", o[i]; for(j=3; j<=5; j++)printf "%s%s", OFS, a[o[i] OFS j]; print ""}}' infile
"201707"|"51976551"|2|0|2
"201707"|"51955194"|2|0|0
"201707"|"51923555"|2|0|2
"201707"|"51960597"|1|0|0
输出-2:
$ awk 'BEGIN{FS=OFS="|"}function ps(f){for(i=3;i<=5;i++)if(f){ a[k OFS i]+=$i; t[k] }else s=(s ? s OFS :"") a[k OFS i]}{k=$1 OFS $2}FNR==NR{ps(1); next}k in t{s=""; ps(); print k, s; delete t[k] }' infile infile
"201707"|"51976551"|2|0|2
"201707"|"51955194"|2|0|0
"201707"|"51923555"|2|0|2
"201707"|"51960597"|1|0|0