2017-08-17 41 views
1

我想顺序编号重复行。可能使用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 

回答

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 }的缩写,因为这是任何真实条件的默认操作。

+0

你能解释代码的工作原理吗? – dood

+1

@dood添加了解释。 –

+0

谢谢SOOO了。这工作完美:) –