如何在grep中同时保存匹配和不匹配的结果

8

我经常使用grep,并熟悉它默认返回匹配行和使用-v参数返回非匹配行的能力。然而,我希望能够一次性使用grep将文件中的匹配行和非匹配行分开。

如果这不可能,请告诉我。我知道我可以轻松地在perl或awk中完成这个任务,但我很想知道是否可以用grep实现。

谢谢!


最好使用Perl,awk不支持Perl正则表达式,但grep可以... - Kent
很好了解...还有,Perl脚本和grep之间的模式匹配速度如何比较?我会在数十亿行的100G文件上使用这些命令。 - jake9115
“grep a file once” 是什么意思?可以使用临时文件吗?😄你想要两个输出文件吗?一个匹配,一个不匹配? - Kent
抱歉,让我澄清一下...我想在一个文件上运行grep命令,并产生两个输出文件,一个匹配的,一个不匹配的。 - jake9115
也许这是不可能的吗? - jake9115
你说“运行grep命令一次”...你的意思是使用那些选项...我不认为这是可能的... - Kent
3个回答

9
如果不一定要使用 grep,可以使用基于模式拆分的单次操作,将匹配到的模式写入 file1 文件,未匹配到的写入 file2 文件。
awk '/pattern/ {print $0 > "file1"; next}{print $0 > "file2"}' inputfile

谢谢您的建议... awk是否支持完整的正则表达式(Perl风格的正则表达式)?之前的帖子建议避免使用awk,因为它有正则表达式的限制。 - jake9115
你可以自行决定需要什么 - 你说过“unix”,这可能包括或不包括GNU awk - http://www.math.utah.edu/docs/info/gawk_5.html。在Solaris上,nawk具有不错的正则表达式功能。 - jim mcnamara
1
awk '{print > (/pattern/ ? "file1" : "file2"}' inputfile - Ed Morton

2
我有过完全相同的问题,我为此编写了一个小型Perl脚本[1]。它只接受一个参数:要在其上进行输入的regex

[1] https://gist.github.com/tonejito/c9c0bffd75d8c81483f9107c609439e1

它按行读取STDIN并检查给定的regex,匹配的行转到STDOUT,不匹配的转到STDERR
我这样做是因为这个工具位于管道的中间,我使用shell重定向将文件保存到它们的最终位置。

0

步骤1:读取文件

步骤2:将空格替换为新行,并将结果保存在临时文件中

步骤3:从临时文件中获取仅包含“_”的行,并将其保存到multiwords.txt中

步骤4:从临时文件中排除包含“-”的行,然后将结果保存到singlewords.txt中

步骤5:删除临时文件

  cat file | tr ' ' '\n' > tmp.txt | grep '_' tmp.txt > multiwords.txt | grep -v '_' tmp.txt > singlewords.txt | find . -type f -name 'tmp.txt' -delete

似乎执行需要很长时间。假设有一百万行。 - purushothaman poovai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接