假设有一个像这样的文件
1 | John Smith | 70000
2 | Al McSmith | 60000
如果我使用
awk -F"|" '$2~/Smith/' file
两行都匹配。
有没有办法只匹配约翰史密斯? (仅限AWK)
编辑:我试图匹配那些以史密斯为姓氏的人,而不是匹配麦克史密斯或者史密斯等人。
答案 0 :(得分:4)
这可能适合你:
awk -F'|' '$2~/ Smith\s*$/' file
它不匹配:
fooSmith
Smithfoo
foo Smith is middlename
答案 1 :(得分:1)
在Smith
之前粘贴一个空格:
awk -F'|' '$2~/ Smith/' testfile
如果其中有John Smitherton
这样的名称,那么也请在后面添加一个空格(因为看起来每个字段之间都有<space><delim><space>
)。否则你可以用正则表达式获得一点点,但你的空间填充在这里非常有用。
答案 2 :(得分:0)
我做了测试。我用你的内容创建了file:test.in:
1 |约翰史密斯| 70000个
2 | Al McSmith | 60000
然后尝试了另一种表达方式:
awk -F'|' '{print $2~/\sSmith\s/}' test.in
打印:
1
0
所以,史密斯1,麦克史密斯0。
[UPD] \s
- 是一个特定于gawk
答案 3 :(得分:0)
使用grep
grep -E "[^|]*\|[^|]*\<Smith\>"
<强>解释强>
[^|]
匹配除|
\|
与|
\<
\>
开头和结尾