首页 > 解决方案 > 仅搜索列中具有确切字符串的行

问题描述

示例输入文件(制表符分隔的列):

1ea73495-490d-6dda-9b30-afa37288d418    00627   a1
1ea73495-490d-6dda-9b30-afa37288d418    006273  a2
1ea73495-490d-6dda-9b30-afa37288d418    000627  a3
1ea73495-4b42-6ee8-98fc-338d6d9414f1    00673   a4

我需要找到第二列是 00627 或 00673 的所有行。按照命令我得到所有行:

$ awk -F$'\t' -vu="00627|00673" '$2~u' input
1ea73495-490d-6dda-9b30-afa37288d418    00627   a1
1ea73495-490d-6dda-9b30-afa37288d418    006273  a2
1ea73495-490d-6dda-9b30-afa37288d418    000627  a3
1ea73495-4b42-6ee8-98fc-338d6d9414f1    00673   a4

以下命令失败:

$ awk -F$'\t' -vu="00627|00673" '$2~^u$' input
awk: cmd. line:1: $2~^u$
awk: cmd. line:1:    ^ syntax error
$ awk -F$'\t' -vu="00627|00673" '$2~^(u)$' input
awk: cmd. line:1: $2~^(u)$
awk: cmd. line:1:    ^ syntax error
awk: cmd. line:2: $2~^(u)$
awk: cmd. line:2:         ^ unexpected newline or end of string
$ awk -F$'\t' -vu="00627|00673" '$2~/^(u)$/' input
$

更新:我找到了使用 shell 变量的解决方案:

$ list="00627|00673"
$ awk -F$'\t' -vu="00627|00673" '$2~/^('"$list"')$/' input
1ea73495-490d-6dda-9b30-afa37288d418    00627   a1
1ea73495-4b42-6ee8-98fc-338d6d9414f1    00673   a4
$

标签: awk

解决方案


您需要限制正则表达式。这不是最好的解决方案,但你可以这样做:

awk -v u='^00627$|^00673$' '$2~u' input

另一种选择是:

awk -v u='00627|00673' 'BEGIN{split(u, a, "|"); for(i in a) {b[a[i]] = 1}} $2 in b ' input

推荐阅读