我有两个文本文件,文件1是这样的:计算单词的列表出现在文本文件中
apple
dog
cat
..
..
和File2看起来是这样的:
appledogtree
dog
catapple
apple00001
..
..
我想算在出现从文件2文件1的单词列表,并得到结果如下图所示:
(字File1中,出现的次数在文件2)
apple 3
dog 2
cat 1
如何通过使用Bash命令行来执行此操作?
我有两个文本文件,文件1是这样的:计算单词的列表出现在文本文件中
apple
dog
cat
..
..
和File2看起来是这样的:
appledogtree
dog
catapple
apple00001
..
..
我想算在出现从文件2文件1的单词列表,并得到结果如下图所示:
(字File1中,出现的次数在文件2)
apple 3
dog 2
cat 1
如何通过使用Bash命令行来执行此操作?
考虑:
$ 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]}'
哪些呢:
cat f1.txt
提出到标准输入文件的内容;xargs
将其翻译为一行;sed -e 's/ /\|/g'
将单词加入"apple|dog|cat"
;grep -Eof /dev/stdin f2.txt
使用该模式打印模式的匹配;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
如果f1.txt很大,这可能会非常昂贵。 – codeforester
谢谢!这像一个魅力。 – user3260372
您可以使用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中的图案。TXTsort | uniq -c
计数匹配模式awk
交换在uniq -c
输出这就是我想要的,非常感谢你! – user3260372
很高兴为你效劳。 http://stackoverflow.com/help/someone-answers – codeforester
鉴于我的答案中有相同的输入文件,'fgrep'没有得到'cat' – dawg
在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
这不是一个规划问题/ Q。但'grep'应该能够帮助你。将来,请使用突出显示的文本编辑框左上方的格式化工具将其格式化为代码/数据/输出。祝你好运。 – shellter