如何解决使用管道和字数wc然后整理结果
我想打扮我正在做的grep的输出。
想象一下一个包含大量文本的文件text.txt。然后我执行命令:
grep fred text.txt | wc -l
grep bob text.txt | wc -l
grep james text.txt | wc -l
我得到输出:
12
3
4
我要在输出中显示的内容是:
fred was found on 12 lines.
bob was found on 3 lines.
james was found on 4 lines.
我该怎么做?
解决方法
在shell脚本中,使用grep -c
对行进行计数:
for name in fred bob james
do
echo "$name was found on $(grep -c $name text.txt) lines."
done
这将运行一半的进程。假设您最终不想使用空格('lucy anne'
)或引号("o'reilly"
)来搜索名称-如果您需要更通用的名称,还可以在命令替换中,在$name
周围使用双引号需要更加小心。
但是,您可以使用awk
(或Perl或Python或…)扫描一次文件,如果文件很大,则可以节省很多:
awk '
/fred/ { count["fred"]++ }
/bob/ { count["bob"]++ }
/james/ { count["james"]++ }
END { for (name in count) print name,"was found on",count[name],"lines." }
' text.txt
这与answer的RavinderSingh13类似,但它仅计算出现名称的行,而不统计出现的总数(因此,如果一行包含“鲍勃在水面上晃动,所有散乱的气泡” ,它将计为1行,而不是3次)。请注意,搜索既不区分大小写(不计入“ Bob”),也不受任何合理的单词定义约束来匹配“单词”。这些注释也适用于grep
解决方案,但是您也可以使用诸如-i
这样的选项来区分大小写(来自POSIX),而使用-w
来匹配单词(GNU grep
以及其他一些,例如BSD以及macOS X)。
您可以尝试在awk
中进行跟踪(由于未提供示例,因此未进行测试),以防您awk
没事,无需运行许多grep
+ {{1} }命令,可以在单个wc
程序本身中完成。
awk
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。