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

时间:2017-03-20 13:45:40

标签: 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出现7次,则在文件“Spiroplasma_culicicola”中,然后在第一次出现时,它应写入Spiroplasma_culicicola_1, 第二次出现的旁边Spiroplasma_culicicola_2 第三次出现Spiroplasma_culicicola_3旁边 等等

我尝试通过sed单独查找每个模式

来做到这一点
sed -z 's/Spiroplasma_culicicola/Spiroplasma_culicicola_2/2'

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

提前致谢

1 个答案:

答案 0 :(得分:1)

对于像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