使用AWK处理含数组的CSV文件:单元格含逗号致字段分割失败
解决AWK分割含内嵌逗号的CSV文件问题
直接用awk -F,分割CSV会出错,因为部分字段(比如示例中引号包裹的ADDRESSES列)包含内嵌逗号,AWK默认不会识别引号作为字段的边界。要实现提取主机名和对应IPv4地址的需求,可以用GNU AWK(gawk)的FPAT特性来正确解析CSV字段。
解决方案命令
gawk 'BEGIN { # 定义CSV字段格式:要么是引号包裹的内容,要么是不含逗号的内容 FPAT = "([^,]*)|\"([^\"]*)\"" } NR > 1 { # 跳过表头行 host = $1 addr_col = $NF # 取最后一列(ADDRESSES) # 循环提取列中的IPv4地址 while (match(addr_col, /([0-9]{1,3}\.){3}[0-9]{1,3}/, ip)) { print host, ip[0] # 截取剩余字符串,继续匹配下一个IP addr_col = substr(addr_col, RSTART + RLENGTH) } }' your_csv_file.csv
命令解释
- FPAT设置:
FPAT = "([^,]*)|\"([^\"]*)\""告诉gawk如何识别CSV字段——要么是没有逗号的连续字符,要么是被双引号包裹的内容(即使里面有逗号也视为一个字段)。 - 跳过表头:
NR > 1忽略第一行的表头。 - 提取字段:
$1获取主机名字段,$NF获取最后一列的地址数据(假设ADDRESSES是CSV的最后一列)。 - 匹配IPv4:用正则
([0-9]{1,3}\.){3}[0-9]{1,3}匹配IPv4地址,通过match函数循环提取所有符合的地址,逐行输出主机名和对应IP。
输出结果
运行上述命令后,会得到你期望的输出:
host1 192.168.x.99 host1 192.168.x.100 host2 192.168.x.101
内容的提问来源于stack exchange,提问作者N. J
相关产品推荐
相关产品推荐

