为了保持秩序:
在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