2013-09-23 43 views
2

我必须从一个文件中grep每一行并计算另一个文件中的出现次数。两个模板文件的内容是:从另一个文件中的文件中grep每行

template_service:

CO_SERVICE_SVCID268435463;Main Service 
CO_FT_NON_BESTOWED_SVCID268435464;Bestowed Service 
CO_SFT_NON_BESTOWED_SVCID268435465;Non Bestowed Service 

模板1(做出来的第一个文件本身):

CO_SERVICE_SVCID268435463 
CO_FT_NON_BESTOWED_SVCID268435464 
CO_SFT_NON_BESTOWED_SVCID268435465 

其中包含搜索字符串(即每个不同的线路)。 ,还有另一个文件(text3.txt),其中包含上述三个字符串中的任意一个(其中template_service的内容也可能有所不同,但不是固定的)。

这是我所编写的代码:

file="/somepath/etc/template_service.txt" 

while IFS= read -r line 
do 

       echo "$line" | cut -d';' -f1 >>template1.txt 
       echo "$line" | cut -d';' -f2 >>template2.txt 
       grep -c -f template1.txt text3.txt >>final_count.txt <--problematic statement showing incorrect count 

done <"$file" 

这应该在text3.txt计数每一行的次数从文件中的一个,并在final_count.txt 这被示出作为输出打印结果:

60000 
120000 
180000 

但输出应该是:

60000 
60000 
60000 

为什么它还添加了以前的总和?

回答

2

为什么它还添加了以前的总和?

正因为如此:

echo "$line" | cut -d';' -f1 >>template1.txt 

将其更改为:

echo "$line" | cut -d';' -f1 >template1.txt 

应该解决这个问题。使用>>会使该行为附加到文件,导致前一个计数被添加到结果。

+0

您误解了我的问题...... echo“$ line”中没有问题|砍掉-d';' -f1 >> template1.txt行..问题出在grep -c -f template1.txt text3.txt >> final_count.txt显示错误的输出.. – subodh1989

+0

@ subodh1989我不这么认为。问题是,在阅读'template_service.txt'时,你会继续追加到目前为止已读过的内容。所以'grep -f'会匹配之前添加的+新添加的模式。 – devnull

+0

谢谢,你是对的! – subodh1989

1

您总是附加到templateX.txt文件(您使用>>)。

所以第二次调用grep时,它使用了template_service.txt的前两行,第三次使用了所有三行。

请尝试使用>来编写templateX.txt文件。

相关问题