我正在尝试将一个数字附加到记录中,该记录指示文件中特定列中特定值发生了多少次。例如,让我们说我的文件如下:
John,Guitar
John,Vocals
John,Piano
Paul,Bass
Paul,Vocals
George,Guitar
George,Vocals
Ringo,Drums
我想要的是输出一个如下所示的文件:
John,Guitar,1
John,Vocals,2
John,Piano,3
Paul,Bass,1
Paul,Vocals,2
George,Guitar,1
George,Vocals,2
Ringo,Drums,1
我如何在awk中实现这一目标?我也会接受使用shell脚本或sed的答案,因为我只是猜测awk可能是处理这个问题的好方法。
答案 0 :(得分:9)
Awk
解决方案:
awk 'BEGIN{ FS=OFS="," }{ $0=$0 OFS (++a[$1]) }1' file
输出:
John,Guitar,1
John,Vocals,2
John,Piano,3
Paul,Bass,1
Paul,Vocals,2
George,Guitar,1
George,Vocals,2
Ringo,Drums,1
与print
运算符相同:
awk 'BEGIN{ FS=OFS="," }{ print $0,(++a[$1]) }' file
答案 1 :(得分:2)
使用awk:
awk 'BEGIN{FS=OFS=","} {print $1,$2,++counter[$1]}' file
输出:
John,Guitar,1 John,Vocals,2 John,Piano,3 Paul,Bass,1 Paul,Vocals,2 George,Guitar,1 George,Vocals,2 Ringo,Drums,1
答案 2 :(得分:1)
使用awk的另一种方法
awk '{b=$0;sub(",.*","");$0=b","++c[$0]}1' infile
答案 3 :(得分:0)
如果您的Input_file已排序(如第一个字段所示的样本),那么以下内容也可能对您有所帮助:
awk -F, 'prev!=$1 && prev{print prev,val;count=val=""} {count++;val=val?val ORS $0 OFS count:$0 OFS count;prev=$1}' OFS=, Input_file
现在添加一种非单线形式的解决方案:
awk -F, '
prev!=$1 && prev{
print prev,val;
count=val=""
}
{
count++;
val=val?val ORS $0 OFS count:$0 OFS count;
prev=$1
}
' OFS=, Input_file
编辑: 如果我们一直想确保只计算字段数大于1的那些行,那么上面代码中的一点调整就会有所帮助这里。
awk -F, 'prev!=$1 && prev{print prev,val;count=val=""} {if(NF>1){count++};val=val?val ORS $0 OFS count:$0 OFS count;prev=$1}' OFS=, Input_file