我想按顺序编号重复的行。可能使用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
答案 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 }
的简写,因为这是任何真实条件的默认操作。