如何使用awk附加字段的出现?

时间:2018-02-13 18:53:56

标签: bash shell awk sed gawk

我正在尝试将一个数字附加到记录中,该记录指示文件中特定列中特定值发生了多少次。例如,让我们说我的文件如下:

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可能是处理这个问题的好方法。

4 个答案:

答案 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