具有模式的Grep文件,并在不更改顺序的情况下计数文件中的各个模式匹配

时间:2019-04-13 08:59:58

标签: grep

我需要使用pattern.txt中的数字从input.txt中获取总匹配项,它也需要在标签之间进行匹配。

这是我正在使用的代码,它可以正常工作,但是输出应该与input.txt排序相同,并且还要从最终输出中删除模式

grep -of pattern.txt input.txt | sort | uniq -c | awk '{print $2,$1}' > output.txt

pattern.txt:

sistersdrama.com
sisterssatellite.com
orientalsisters.com

input.txt:

<Model Make="www.sistersdrama.com" Displacement="1.6" HP="116" Year="2003"/>
<Model Make="sistersdrama.com="3.5" HP="298" Year="2003"/>
<Model Make="sistersdrama.com" Displacement="3.0" HP="200" Year="2011"/>
<Model Make="sistersdrama.com" Displacement="2.0" HP="257" Year="2002"/>
<Model Make="www.sisterssatellite.com" Displacement="2.5" HP="278" 
Year="2002"/>
<Model Make="www.sisterssatellite.com" Displacement="3.0" HP="224" 
Year="2009"/>
<Model Make="sisterssatellite.com" Displacement="1.8" HP="172" 
Year="2007"/>
<Model Make="sisterssatellite.com" Displacement="2.8" HP="186" 
Year="2001"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="179" 
Year="2006"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="207" 
Year="2013"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="246" 
Year="2008"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="244" 
Year="1999"/>
<Model Name="orientalsisters.com" Displacement="2.8" HP="244" 
Year="1999"/>

使用的代码我得到了output.txt:

orientalsisters.com 4
sistersdrama.com 3
sisterssatellite.com 2

预期结果与pattern.txt的顺序相同,只有数字并减去2:

1
0
2

1 个答案:

答案 0 :(得分:0)

删除sort,并将awk'{print $2,$1}'更改为'{print $1}'

grep -of pattern.txt input.txt | uniq -c | awk '{print $1}'

如果您想从每个结果中减去2,则为

grep -of pattern.txt input.txt | uniq -c | awk '{print $1-2}'

编辑

您已经多次更改了您的问题,并且每次都提出了根本不同的请求。您应该按原样保留问题的旧版本,因为这些根本性的变化会使答案也变得不正确且无关紧要。如果您想要其他内容,只需在此处创建新帖子并询问。

如果您有多个名称模式为input * .txt的文件(例如,input_1.txt input_2.txt input(无论如何).txt),这应该可以:

cat pattern.txt |sed s/\\./\\\\\\\\./g|xargs -I {} grep -o "$(echo "Make=\"{}\"\|Make Model=\"{}\"")" input*.txt | sed -r -e 's/.*=\"(.*)\"/ \1 /g' > temp_agg.txt && cat pattern.txt|sed s/\\./\\\\\\\\./g | xargs -I {} grep -o {} temp_agg.txt | uniq -c | awk '{print $1-2}'