linux - 找到出现的次数并将其添加到模式旁边

标签 linux awk sed tags find-occurrences

我在一个目录中有几个文件,在其中一些文件中,某些模式出现了多次。例如

文件“8_list”的内容:

Spiroplasma_taiwanense 
Spiroplasma_diminutum 
Spiroplasma_apis 
Spiroplasma_sabaudiense 
Spiroplasma_taiwanense 
Spiroplasma_diminutum 
Spiroplasma_taiwanense 
EntAcro10
EntAcro10
Spiroplasma_apis 
Spiroplasma_culicicola 
Spiroplasma_sabaudiense 
Spiroplasma_diminutum 
Spiroplasma_sabaudiense 
Spiroplasma_sabaudiense 
Spiroplasma_sabaudiense 
Spiroplasma_apis 
Spiroplasma_culicicola 
Spiroplasma_culicicola 
Spiroplasma_culicicola 
Spiroplasma_culicicola 
Spiroplasma_diminutum 
Spiroplasma_culicicola 
Spiroplasma_culicicola 
EntAcro1

和文件“574_list”的内容

Mesoplasma_florum_l1
Spiroplasma_sabaudiense 
Mesoplasma_florum_w37
EntAcro1

所有文件都有一个单独的列。 我想要做的是在每个文件中找到相同的模式,然后在它旁边添加一个数字来描述发生的情况。例如,在文件“8_list”中,如果 Spiroplasma_culicicola 出现了 7 次,那么在第一次出现的旁边应该写上 Spiroplasma_culicicola_1, 在第二次出现的旁边 Spiroplasma_culicicola_2 在第三次出现的旁边 Spiroplasma_culicicola_3 等等等等

我尝试通过单独查找每个模式来使用 sed 来做到这一点

sed -z 's/Spiroplasma_culicicola/Spiroplasma_culicicola_2/2'

但我想知道是否有更简单的方法来为给定目录中的所有文件和所有模式执行此操作

提前致谢

最佳答案

对于像 awk 这样好的工具来说,这是一项很好的任务:

awk '{gsub(" ", "", $0); a[$0]++; print $0"_"a[$0]}' 8_list

gsub("", "", $0); - 替换行尾的尾随空格

a[$0]++; - 递增每个模式(列值)的出现次数,将列值视为数组键


输出:

Spiroplasma_taiwanense_1
Spiroplasma_diminutum_1
Spiroplasma_apis_1
Spiroplasma_sabaudiense_1
Spiroplasma_taiwanense_2
Spiroplasma_diminutum_2
Spiroplasma_taiwanense_3
EntAcro10_1
EntAcro10_2
Spiroplasma_apis_2
Spiroplasma_culicicola_1
Spiroplasma_sabaudiense_2
Spiroplasma_diminutum_3
Spiroplasma_sabaudiense_3
Spiroplasma_sabaudiense_4
Spiroplasma_sabaudiense_5
Spiroplasma_apis_3
Spiroplasma_culicicola_2
Spiroplasma_culicicola_3
Spiroplasma_culicicola_4
Spiroplasma_culicicola_5
Spiroplasma_diminutum_4
Spiroplasma_culicicola_6
Spiroplasma_culicicola_7
EntAcro1_1

关于linux - 找到出现的次数并将其添加到模式旁边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42905237/

相关文章:

linux - 将文件从 Windows 传输到 Linux,而无需使用第 3 方软件且仅使用 Shell.Application

perl - 删除数据集中的空行

linux - 模式解码二

sed - 使用 awk 和 sed 连接行

linux - 查找 "string1"并删除它和 "string2"之间的内容

linux - 使用 awk 或 sed 打印从第 n 到最后的所有列

c - 在 C 中每 x 秒执行一个方法

linux - 用shell脚本中的空行替换文件的一行?

python - 将列表项与同一列表另一端的项目匹配?

regex - sed/正则表达式 : How to match a '<' or '>' in a string