2

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

模板服务:

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)有 1,00,000+ 行,其中包含上述三个字符串中的任何一个(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

为什么还要加上前面的总和?

4

2 回答 2

2

为什么还要加上前面的总和?

因为这:

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

将其更改为:

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

应该解决这个问题。使用>>会导致将行附加到文件中,从而将先前的计数添加到结果中。

于 2013-09-23T13:00:54.933 回答
1

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

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

而是尝试使用>来写入templateX.txt文件。

于 2013-09-23T13:01:01.207 回答