【问题标题】:How to insert a column at a certain position in a CSV file using AWK and dealing with quotes?如何使用 AWK 在 CSV 文件的某个位置插入一列并处理引号?
【发布时间】:2017-07-13 14:38:32
【问题描述】:

msg_type,mmsi,timestamp,imo,name,ship_and_cargo_type,length,width,draft,eta_date,destination

24,510041000,2016-07-05 12:49:16 UTC,,,30,29,6,,,

5,371952000,2016-07-16 07:30:40 UTC,9687112,SPRING

LEGEND,90,190,32,11.7,2016-08-08 00:00:00 UTC,"ONAHAMA,JAPAN"

5,412331087,2016-07-24 11:14:02 UTC,0,陆皇园

117,30,0,0,0,,"" 5,775994600,2016-07-02 07:43:55 UTC,9318814,伊丽莎白

A MCCALL,60,44,9,3.5,2016-11-16 06:05:00 UTC,GUIRIA

我试图在该表的倒数第二个字段中插入一个空列。例如,标题看起来像这样:

msg_type,mmsi,timestamp,imo,name,ship_and_cargo_type,length,width,draft,eta_date,,destination

我正在使用 AWK 命令,但它不能正确处理引号,例如“ONAHAMA,JAPAN”。

有没有更好的方法,我该如何克服这个问题?这是我的尝试。

谢谢

awk -F, -v OFS="," '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,","$11}' old_table > new_table

【问题讨论】:

    标签: csv awk sed csvkit


    【解决方案1】:

    这种特殊情况可以使用sed 解决,但请查看具有csv 模块的perlpython

    $ sed -E 's/"[^"]+"$|[^,]*$/,&/' ip.txt
    msg_type,mmsi,timestamp,imo,name,ship_and_cargo_type,length,width,draught,eta_date,,destination
    24,510041000,2016-07-05 12:49:16 UTC,,,30,29,6,,,,
    5,371952000,2016-07-16 07:30:40 UTC,9687112,,SPRING
    LEGEND,90,190,32,11.7,2016-08-08 00:00:00 UTC,,"ONAHAMA,JAPAN"
    5,412331087,2016-07-24 11:14:02 UTC,0,,LU HUANG YUAN YU
    117,30,0,0,0,,"" 5,775994600,2016-07-02 07:43:55 UTC,9318814,,ELIZABETH
    A MCCALL,60,44,9,3.5,2016-11-16 06:05:00 UTC,,GUIRIA
    
    • -E 使用扩展正则表达式,一些实现使用 -r 代替
    • "[^"]+"$|[^,]*$ 最后一个字段在双引号内,否则非, 字符
    • ,& 替换为 , 并匹配文本

    【讨论】:

      【解决方案2】:

      gawk 解决方案:

      awk -v FPAT='"[^"]+"|[^,]+' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,","$11}' OFS=',' old_table > new_table
      
      • v FPAT='"[^"]+"|[^,]+' - 模式定义字段值

      【讨论】:

        猜你喜欢
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多