【问题标题】:grep each line from a file in another filegrep 来自另一个文件中的文件的每一行
【发布时间】:2013-09-23 21:06:37
【问题描述】:

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

模板服务:

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

template1(由第一个文件本身制成):

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

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

【问题讨论】:

    标签: shell grep


    【解决方案1】:

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

    因为这个:

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

    改成:

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

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

    【讨论】:

    • 你误解了我的问题... echo "$line" | 没有问题剪切-d';' -f1 >>template1.txt line..问题出在 grep -c -f template1.txt text3.txt >>final_count.txt 显示错误的输出..
    • @subodh1989 我不这么认为。问题是,在阅读template_service.txt 时,您会继续附加您目前所阅读的内容。所以grep -f 会匹配之前添加的+新添加的模式。
    【解决方案2】:

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

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

    改为尝试使用&gt; 写入templateX.txt 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多