![每个文本文件中相同行的数目](https://linux22.com/image/116914/%E6%AF%8F%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9B%B8%E5%90%8C%E8%A1%8C%E7%9A%84%E6%95%B0%E7%9B%AE.png)
我有超过 30 个不同的文本文件,每个文件都有一个重复不同时间的相同单词,例如在 text1“esr”中重复 12 次,在 text2“esr”中重复 21 次。
是否可以用一个命令单独输出该单词重复的次数?
答案1
和grep+厕所管道:
for f in *.txt; do echo -n "$f "; grep -wo 'esr' "$f" | wc -l; done
grep选项:
-w
- 单词正则表达式(匹配整个/单独的单词)-o
- 只打印匹配的子字符串
wc -l
- 计算每个文件的行数(在我们的例子中是匹配的单词)
答案2
strings ./*.txt|tr " " "\n"|sort|uniq -c
答案3
答案4
如果您想计算任意数量文件中的每个单词,您可以使用AWK
例如:
awk 'BEGIN{RS="[[:space:]]+"}
{counts[$0]++}
END{for(word in counts){print word " - " counts[word]}
' file1 file2 file...
这会将文件视为每个单词都在单独的行上,那就是BEGIN{RS="[[:space:]]+"}
部分,然后每次看到一个时进行计数线。删除该BEGIN
部分将计算每个普通的线。
如果您只对 1 个特定单词感兴趣,您可以将该END
块更改为如下所示:
END{print counts["esr"]}
这只会打印“esr”出现的时间,但请记住这是区分大小写的。
要消除区分大小写,请使用counts[tolower($0)]++
或counts[toupper($0)]++
。
当计数从一个文件转到下一个文件时,也可以添加检查以打印数据。