行の文字に従って、横に対応する数字を印刷します。

行の文字に従って、横に対応する数字を印刷します。

次の入力形式があります。

H
O
C
H
H
C
H
H
O
C
H
H
C

次のような出力を得たいと思います。

H1
O1
C1
H2
H3
C2
H4
H5
O2
C3
H6
H7
C4

答え1

awk以下の簡単なコマンドを使用できます。以下では、ファイル内のその単語の発生回数を示す値を現在の行に追加して、行全体{..}1を簡単に再構成します。$0

awk '{ $0 = $0 "" ++unique[$0] }1' file

この部分は値をキーとしてunique[$0]ハッシュマップを生成します。事前増分は、配列の値をに増やします。各行を明示的に再生成する代わりに、各行の最後にカウンタを追加することもできます。$0unique['H'], unique['O']unique['H']=1unique['H']=2

awk '{ print($0 "" ++unique[$0]) }' file

同じロジックを使用する同等のPerlバージョン

perl -lpe '{ $_ .= ++$unique{$_} }' file

後者は、文字がそれぞれ別々の行にない状況に簡単に適用できます。たとえば、次のようになります。

$ echo ABBC | perl -lpe 's/./$& . ++$unique{$&}/ge'
A1B1B2C1

関連情報