如何使用 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增加数组中的计数器。 当第二次读取时,测试给定行的计数器是否大于 1。如果为 true,则增加数组中的计数器 并附加后缀和计数器值。然后打印该行。a>
fileb_

相关内容