【问题标题】:search only lines with exact string in a column仅搜索列中具有确切字符串的行
【发布时间】:2021-03-21 19:58:17
【问题描述】:

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

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 -F$'\t' -vu="00627|00673" '$2==u' 输入

标签: awk


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    或者:

    awk '$2 ~ /^(00627|00673)$/'
    

    awk '{ if ($2 ~ /^(00627|00673)$/) print }'
    

    【讨论】:

      【解决方案3】:

      我找到了使用 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
      $
      

      William 给出的解决方案也可以,但我自动获取列表,如示例,用管道分隔。

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2020-02-01
        • 2023-03-13
        • 2017-01-28
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多