如何按顺序编号重复行?

时间:2017-08-17 17:57:08

标签: bash awk rename

我想按顺序编号重复的行。可能使用awk,但任何unix代码都可以。例如,我想

3J8934
4Y9384
3T2938
3J8934
4Y9384
7I5938

成为

3J8934_01
4Y9384_01
3T2938_01
3J8934_02
4Y9384_02
7I5938_01

到目前为止,我已经能够使用awk使用_02标记重复项,但它不会标记第一个重复项或与_01不重复。

awk 'cnt[$0]++{$0=$0"_0"cnt[$0]}1' filename.txt

1 个答案:

答案 0 :(得分:2)

你非常接近。以下是我将如何做到这一点:

$ awk '{ $0 = $0 sprintf("_%02d", ++count[$0]) } 1' infile
3J8934_01
4Y9384_01
3T2938_01
3J8934_02
4Y9384_02
7I5938_01

对于每一行,我们附加sprintf("_%02d", ++count[$0]),即下划线后跟一个数字,零填充为两位数(如果适用)。该数字的值为++count[$0]:这是我们已经看到该行的次数。

count是一个由整行索引的关联数组;它是由++ 预先递增,即先递增,然后打印。当我们第一次看到一行时,计数器被隐式初始化为零,递增,并且我们追加_01,依此类推。

最后的1{ print $0 }的简写,因为这是任何真实条件的默认操作。