枚举awk中具有相同ID的行

时间:2016-09-30 18:02:28

标签: awk

我使用awk来处理以下[样本]数据:

id,desc
168048,Prod_A
217215,Prod_C
217215,Prod_B
168050,Prod_A
168050,Prod_F
168050,Prod_B

我尝试做的是创建一个列'item'列,列明同一个'id'中的行:

id,desc,item
168048,Prod_A,#1
217215,Prod_C,#1
217215,Prod_B,#2
168050,Prod_A,#1
168050,Prod_F,#2
168050,Prod_B,#3

我在这里尝试过:

BEGIN {
  FS = ","
  a = 1
}
NR != 1 {
  if (id != $1) {
    id = $1
    printf "%s,%s\n", $0, "#"a
  }
  else {
    printf "%s,%s\n", $0, "#"a++
  }
}

但这会使编号混乱:

168048,Prod_A,#1
217215,Prod_C,#1
217215,Prod_B,#1
168050,Prod_A,#2
168050,Prod_F,#2
168050,Prod_B,#3

有人可以给我一些提示吗?

P.S。行顺序无关紧要

1 个答案:

答案 0 :(得分:2)

$ awk -F, 'NR>1{print $0,"#"++c[$1]}' OFS=, file
168048,Prod_A,#1
217215,Prod_C,#1
217215,Prod_B,#2
168050,Prod_A,#1
168050,Prod_F,#2
168050,Prod_B,#3

如何运作

  • -F,

    这会将输入中的字段分隔符设置为逗号。

  • NR>1{...}

    这会将大括号中的命令限制为第一行以外的行,也就是带有标题的行。

  • print $0,"#"++c[$1]

    这会打印后跟#的行,以及我们看到第一列的次数。

    关联数组c会计算id被查看的次数。对于每一行,我们将id $1的计数加1。 ++递增。由于++位于c[$1]之前,因此如果打印了值,则之前完成增量。

  • OFS=,

    这会将输出上的字段分隔符设置为逗号。

同时打印新标题

$ awk -F, 'NR==1{print $0,"item"} NR>1{print $0,"#"++c[$1]}' OFS=, file
id,desc,item
168048,Prod_A,#1
217215,Prod_C,#1
217215,Prod_B,#2
168050,Prod_A,#1
168050,Prod_F,#2
168050,Prod_B,#3