我有一个像这样的命令
rga --files-with-matches --count-matches --sort path -i -e "use cases?" -e "user stor(y|ies)" -e "Technical debt" -e "Code Quality" -e "software development" -e "Agile Manifesto"
输出就像
a1.pdf:18
a2.pdf:10
a3.pdf:14
....
这里,:NUM
是匹配数。
我想要所有具有超过 10 个匹配项的文件(不带冒号和数字,以便我可以将输出通过管道传输到另一个命令)。喜欢:
a1.pdf
a3.pdf
....
我尝试过.. | cut -d':' -f2
,但它只给出了数字。.. | cut -d':' -f1
仅给出文件名。
这里的解决方案可能是什么?
答案1
即使文件名确实包含字符:
,这也将起作用。它使用两个捕获组,第一个捕获直到(但不包括):
行中最后一个字符(文件名)的所有内容,第二个捕获最后一个字符之后的所有数字:
(计数)。与该模式不匹配的输入行将被忽略。
$ rga ... | perl -n -E 'm/^(.*):(\d+)$/; say $1 if $2 > 10'
a1.pdf
a3.pdf
它不适用于包含换行符的文件名。如果您需要它,并且rga
可以生成 NUL 分隔的输出(例如,使用-0
或-z
或类似的选项),您可以将其与 perl 的选项结合使用-0
来读取 NUL 分隔的输入。
答案2
和awk
:
... | awk -F: '$NF>10{ sub(/:[0-9]+$/, ""); print }'
拆分记录:
并测试最后一个字段是否大于 10。如果条件为真,则删除:
记录末尾的至少一位数字。打印(修改的)记录。