awk - 仅搜索列中具有确切字符串的行
问题描述
示例输入文件(制表符分隔的列):
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 -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
推荐阅读
- flutter - 用包装的小气泡文本框包装 ListView Builder 输出
- r - 为什么我在 R 中的经纬度点的交点与正确的邮政编码不一致?
- javascript - 使用 Object.entries 循环有什么问题?
- python - 并行化 for 循环 - Python - 意外问题
- dialogflow-es - DialogFlow:在同时处于活动状态的多个意图中使用系统默认实体(例如,sys.any、sys.time-period)时出错
- java - Keycloak + Spring Cloud Gateway + 认证授权
- python - mutliprocessing TypeError:'float'对象不可迭代
- vue.js - Symfony - vue js - 调试工具栏
- angular - 当在 Angular 中调用或执行方法时,我如何收听方法
- javascript - Javascript for...of 循环运行一个太多次的对象数组