2017-01-30 119 views
3

我有两个文本文件,文件1是这样的:计算单词的列表出现在文本文件中

apple 
dog 
cat 
.. 
.. 

和File2看起来是这样的:

appledogtree 
dog 
catapple 
apple00001 
.. 
.. 

我想算在出现从文件2文件1的单词列表,并得到结果如下图所示:

(字File1中,出现的次数在文件2)

apple 3 
dog 2 
cat 1 

如何通过使用Bash命令行来执行此操作?

+0

这不是一个规划问题/ Q。但'grep'应该能够帮助你。将来,请使用突出显示的文本编辑框左上方的格式化工具将其格式化为代码/数据/输出。祝你好运。 – shellter

回答

2

考虑:

$ cat f1.txt 
apple 
dog 
cat 
$ cat f2.txt 
appledogtree 
dog 
catapple 
apple00001 

尝试:

while IFS= read -r line || [[ -n $line ]]; do 
    printf "%s->%s\n" $line "$(grep -c $line f2.txt)" 
done <f1.txt 

打印:

apple->3 
dog->2 
cat->1 

如果你想有一个管道,你可以这样做:

cat f1.txt | xargs | sed -e 's/ /\|/g' | grep -Eof /dev/stdin f2.txt | awk '{a[$1]++} END{for (x in a) print x, a[x]}' 

哪些呢:

  1. cat f1.txt提出到标准输入文件的内容;
  2. xargs将其翻译为一行;
  3. sed -e 's/ /\|/g'将单词加入"apple|dog|cat";
  4. grep -Eof /dev/stdin f2.txt使用该模式打印模式的匹配;
  5. awk '{a[$1]++} END{for (x in a) print x, a[x]}'统计单词并打印计数。

随着GNU的grep,你可以做grep -Eof - f2.txt

这对POSIX和Linux管道工程...


如果你想纯效率只用awk:

awk 'NR==FNR {pat[FNR]=$1; next} 
      {for (i in pat){ if(match($0, pat[i])){m[pat[i]]++}}} 
      END{for(e in m){print e,m[e]}}' f1.txt f2.txt 
+0

如果f1.txt很大,这可能会非常昂贵。 – codeforester

+1

谢谢!这像一个魅力。 – user3260372

2

您可以使用fgrep高效完成此操作:

fgrep -of f1.txt f2.txt | sort | uniq -c | awk '{print $2 " " $1}' 

给出这个输出:

apple 3 
cat 1 
dog 2 
  • fgrep -of f1.txt f2.txt提取所有匹配的零件(-o选项)f2.txt基于f1中的图案。TXT
  • sort | uniq -c计数匹配模式
  • 最后,awk交换在uniq -c输出
+1

这就是我想要的,非常感谢你! – user3260372

+0

很高兴为你效劳。 http://stackoverflow.com/help/someone-answers – codeforester

+0

鉴于我的答案中有相同的输入文件,'fgrep'没有得到'cat' – dawg

1

在AWK字的顺序:

$ awk 'NR==FNR { a[$1]; next }     # read in all search words 
       { for(i in a) a[i]+=gsub(i,i) } # count matches of all keywords in record 
      END{ for(i in a) print i,a[i] }  # output results 
' file1 file2 
apple 3 
cat 1 
dog 2 
相关问题