sedまたはawkを使用してパターンを含む繰り返し行の末尾に数字を追加する方法

sedまたはawkを使用してパターンを含む繰り返し行の末尾に数字を追加する方法

以下を含む.txtファイルがあります。

>ABC
hello
>ABC
thanks
>ABC
for
>ABC
your
>ABC
help

">"を含む繰り返し文字列を次に変更したいと思います。

>ABC_1
hello
>ABC_2
thanks
>ABC_3
for
>ABC_4
your
>ABC_5
help

答え1

$ awk '{print $0 (/^>/ ? "_" (++c) : "")}' file
>ABC_1
hello
>ABC_2
thanks
>ABC_3
for
>ABC_4
your
>ABC_5
help

最初のフィールドが異なる場合があり、各最初のフィールド値に一意の数が必要な場合は、単に最初のフィールドにインデックス付けされた配列に数を設定できます。

$ cat file
>ABC
hello
>FOO
thanks
>ABC
for
>ABC
your
>FOO
help

$ awk '{print $0 (/^>/ ? "_" (++c[$1]) : "")}' file
>ABC_1
hello
>FOO_1
thanks
>ABC_2
for
>ABC_3
your
>FOO_2
help

答え2

そしてawk

awk '
  NR==FNR && index($0, ">")==1 { a[$0]++ }
  NR!=FNR && a[$0]>1 { $0=$0"_"(++b[$0]) }
  NR!=FNR
' file file

最初の読み取りでは、で始まる各行に対して配列fileのカウンタをインクリメントします。 2番目に読み取るとき、指定された行のカウンタが1より大きいかどうかをテストします。 trueの場合、配列のカウンタをインクリメントし、サフィックスとカウンタ値を追加します。その後、ラインを印刷します。a>
fileb_

関連情報