繁体   English   中英

如何与 awk 严格匹配

[英]How to make a strict match with awk

我正在用另一个文件查询一个文件,并将它们如下所示:

文件1:

Angela S Darvill| text text text text   
Helen Stanley| text text text text   
Carol Haigh S|text text text text .....

文件2:

Carol Haigh  
Helen Stanley  
Angela Darvill

这个命令:

awk 'NR==FNR{_[$1];next} ($1 in _)' File2.txt File1.txt

返回重叠的行,但没有严格匹配。 有严格的比赛,应该只有海伦斯坦利回来了。

你如何限制 awk 严格重叠?

使用您显示的示例,请尝试以下操作。 你走在正确的轨道上,你需要做两件事,第一件事:在读取 file2.txt 时将整行作为数组中a索引并将字段 seapeator 设置为| awk开始读取 file1 之前

awk -F'|' 'NR==FNR{a[$0];next} $1 in a' File2.txt File1.txt

上面的命令对我不起作用(我在 Mac 上,不知道是否重要),但是

awk 'NR==FNR{_[$0];next} ($1 in _)' File2.txt. FS="|" File1.txt

运作良好

您还可以使用grep匹配 File2.txt 作为正则表达式列表以进行精确匹配。

您可以使用sed来准备比赛。 这是一个例子:

sed -E 's/[ \t]*$//; s/^(.*)$/^\1|/' File2.txt
^Carol Haigh|
^Helen Stanley|
^Angela Darvill|
...

然后使用带有sed的过程作为grep-f参数:

grep -f <(sed -E 's/[ \t]*$//; s/^(.*)$/^\1|/' File2.txt) File1.txt
Helen Stanley| text text text text  

由于您的示例 File2.txt 有尾随空格,因此seds/[ \t]*$//; 作为第一个替换。 如果您的实际文件没有这些交易空间,您可以执行以下操作:

grep -f <(sed -E 's/.*/^&|/' File2.txt) File1.txt

Ed Morton 提出了一个很好的观点,即 grep 仍将解释File2.txt中的 RE 元字符。 您可以使用标志-F因此只使用文字字符串:

grep -F -f <(sed -E 's/.*/&|/' File2.txt) File1.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM