2014-10-04 90 views
1

grep -o“$ var”file | wc -l使用grep计数发生的次数

它用于用文本字符串替换“$ var”,但不与变量一起使用。

我检查了“$ var”是一个字符串。

grep -o“$ var”file | wc -l

它用于用文本字符串替换“$ var”,但不与变量一起使用。

我检查了“$ var”是一个字符串。

新:

你好,这里是代码。 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 
+0

使用grep的-c标志,你不需要管它通过wc – Floegipoky 2014-10-04 05:15:13

回答

0

你显示的内容应该按预期工作。它如何失败?

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

#!/usr/bin/env bash 

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

在这里,我使用的是while循环删除Windows后读取文件风格线结束。然后,我使用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 
+0

谢谢!但是列表文件包含非常长的字符串,而不是单词。所以grep -c不起作用,但是grep-o却起作用。 – Wei 2014-10-04 12:37:32

+0

@我不明白。字符串的长度是不相关的,这个解决方案只是将'list.txt'的每一行读作'$ word'。这正是你的'sed'所做的。请[编辑]你的问题,并添加一个输入的例子。无论何时你在这里提出问题,_always_都能为我们提供一个我们可以复制的例子。否则,我们会浪费我们的时间,而你们提供的解决方案不起作用。 – terdon 2014-10-04 12:55:52

+0

对不起@ terdon @ terdon 对不起。 附加示例。 list.txt aa bb cc source。 txt aaccddffzzaabbhh – Wei 2014-10-04 14:13:21

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

+0

嗨,这里是代码。 该清单。txt包含多行单词列表,每行包含一个单词。 source.txt是一个单行文件,它由多个字符组成,没有任何空格。 #/斌/庆典 因为我在$(SEQ 1 100) 做 字= $(sed的 “$ I” 'Q; d' LIST.TXT)! #remove换行符 字= $ {word // $'\ r \ n'/} grep -o“$ word”source.txt | wc -l >>输出 完成 – Wei 2014-10-04 11:40:15