![列出文件中精确字符串的数量](https://linux22.com/image/111956/%E5%88%97%E5%87%BA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%B2%BE%E7%A1%AE%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%95%B0%E9%87%8F.png)
11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1
我有一个如图所示的文件,但规模更大。我的目标是输出111s、1s、11s、1111s等的数量。都在文件里。我看到很多帖子都在谈论做:
grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...
所有这些要么什么也不输出,要么输出整个文件。我应该怎么做才能只列出某些数字?
答案1
使用tr
,sort
和uniq
:
$ tr -s ' ' '\n' <file | sort | uniq -c
1
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
这也为您提供了一个空行的计数(上面输出中的第一行),但您可以使用以下方法避免这种情况sed
:
$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
管道将所有空格更改为换行符,对结果行进行排序并计算每行出现的次数。
答案2
对于这个问题,我不会使用 grep,而是使用 awk:
$ a="11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1"
$ awk '{for (i=1;i<=NF;i++) ++seen[$i]}END{for (k in seen) print k,"found:"seen[k]}' <<<"$a"
1 found:17
11 found:5
111 found:1
11111 found:2
1111111 found:1
11111111 found:1
这个单行演示应该适用于您的整个文件(替换<<<"$a"
为yourfile
)