[英]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 有尾随空格,因此sed
有s/[ \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.