linux - 如何在 bash 中打印具有特定列匹配数组成员的行

标签 linux bash awk

#!/bin/bash    
awk '$1 == "abc" {print}' file # print lines first column matching "abc"

当第一列匹配数组成员(“12”或“34”或“56”)时如何打印行?

#!/bin/bash
ARR=("12" "34" "56")

添加
另外,当第一列与数组成员(“12”或“34”或“56”)完全匹配时如何打印行?

最佳答案

您可以使用 bash 将字符串插入到 Awk 中使用的正则表达式模式,方法是将 IFS 值更改为 | 字符并做数组扩展如下:

ARR=("12" "34" "56")    

regex=$( IFS='|'; echo "${ARR[*]}" )
awk -v str="$regex" '$1 ~ str' file

数组扩展将列表元素转换为以 | 分隔的字符串,例如12|34|56 在这种情况下。

$() 在子 shell 中运行,IFS 的值不会反射(reflect)在父 shell 中。你可以把它写成一行

awk -v str="$( IFS='|'; echo "${ARR[*]}" )" '$1 ~ str' file

OP 还要求对文件中数组中的字符串进行精确匹配,在这种情况下,使用 grep 及其 ERE 支持可以完成这项工作

regex=$( IFS='|'; echo "${ARR[*]}" )
egrep -w "$regex" file

(或)

grep -Ew "$regex" file

关于linux - 如何在 bash 中打印具有特定列匹配数组成员的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47009824/

相关文章:

linux - Sed 在位置前插入符号

bash - 使用双引号和不使用双引号有什么区别?

perl - 在命令行上解析HTML;如何在<strong> </strong>中捕获文本?

C: 尝试实现无名管道

bash - 日期时间到纪元的转换

regex - 打印模式之间的所有行,其中任何行与第二个模式匹配

python os.system 阻止向后命令

linux - 我搞砸了在 Ubuntu 上设置 ufw 防火墙,无法再登录到我的服务器

linux - Shell 脚本,命令行参数

无法安装 MySQL 服务器