我使用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。行顺序无关紧要
答案 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