You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

命令解释

  1. FPAT设置:FPAT = "([^,]*)|\"([^\"]*)\"" 告诉gawk如何识别CSV字段——要么是没有逗号的连续字符,要么是被双引号包裹的内容(即使里面有逗号也视为一个字段)。
  2. 跳过表头:NR > 1 忽略第一行的表头。
  3. 提取字段:$1 获取主机名字段,$NF 获取最后一列的地址数据(假设ADDRESSES是CSV的最后一列)。
  4. 匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:15:16