2017-08-17 9 views
1

重複した行に番号を付けたいと思います。 awkを使用している可能性がありますが、UNIXコードであれば可能です。たとえば、私は重複する行を順に番号付けするにはどうすればよいですか?

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

は私が_02で重複をマークするためにはawkを使用することができたこれまでのところ

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

になりたいが、それは_01で最初の1か重複をマークしません。

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])を追加し、そして、パディングゼロ2桁該当する場合は数字が続く強調する。数値の値は++count[$0]です。これは、既にラインを見た回数です。

countは、行全体で索引付けされた連想配列です。 ++によって事前にインクリメントされたであり、すなわち最初にインクリメントされ、次に印刷される。最初に行が表示されると、カウンタは暗黙的に0に初期化され、インクリメントされ、_01などが追加されます。

最後の1は、すべての真の条件のデフォルトアクションである{ print $0 }の省略形です。

+0

コードの仕組みを説明できますか? – dood

+1

@dood説明を追加しました。 –

+0

ありがとうSOOO。それは完全に働いた:) –

関連する問題