使用grep计算出现次数

时间:2014-10-04 04:36:01

标签: linux grep

grep -o&#34; $ var&#34;档案| wc -l <​​/ p>

当我更换&#34; $ var&#34;带有文本字符串,但不带变量。

我检查了&#34; $ var&#34;是一个字符串。

grep -o&#34; $ var&#34;档案| wc -l <​​/ p>

当我更换&#34; $ var&#34;带有文本字符串,但不带变量。

我检查了&#34; $ var&#34;是一个字符串。

嗨,这是代码。 list.txt包含多行单词列表,每行包含一个单词。 source.txt是一个单行文件,由多个字符组成,没有任何空格。

#!/bin/bash

for i in $(seq 1 100)

do
word=$(sed "$i"'q;d' list.txt)
#remove the new line character
word=${word//$'\r\n'/}


grep -o "$word" source.txt | wc -l >>output


done

list.txt示例:

aa
bb
cc

示例source.txt:

aaccddffzzaabbhh

2 个答案:

答案 0 :(得分:0)

您的问题必须与您开始时将字符串分配给var的方式相同。你的grep表达式的形式,包括变量都可以。假设PATH中有.bashrc - 如果没有分配与i匹配的内容。尝试:

i=PATH; grep -o "$i" ~/.bashrc | wc -l

<强>输出:

5

很容易确认:

$ i=PATH; grep "$i" ~/.bashrc
export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin
#  PATH=$PATH:/usr/lib/festival/ ;export PATH

那是5。如果您仍有问题,请发布如何将值分配给var

答案 1 :(得分:0)

您展示的内容应该按预期工作。它怎么会失败?

在任何情况下,计算anoter文件中每个单词列表出现次数的更好方法是:

#!/usr/bin/env bash

while read word
do
    grep -oc "$word" source.txt >> output
done < <(sed 's/\r//' list.txt)

这里,我在删除Windows样式行结尾后使用while循环来读取文件。然后,我使用grep的-c选项来计算出现次数。在示例文件上运行时,会产生:

$ cat output 
1
1
1

要计算一行中的多个匹配项,您可以尝试这样做:

while read word
do 
    export word; 
    perl -lne '@c=/$ENV{"word"}/g; $f=scalar @c; print $f if $f>0' source.txt 
done < list.txt