如何使用AWK在CSV文件中的某个位置插入列并处理引号?

时间:2017-07-13 14:38:33

标签: csv awk sed csvkit

  

MSG_TYPE,MMSI,时间戳,伊莫名,ship_and_cargo_type,长度,宽度,吃水,eta_date,目的地

     

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

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

  

MSG_TYPE,MMSI,时间戳,伊莫名,ship_and_cargo_type,长度,宽度,吃水,eta_date ,,目的地

我正在使用AWK命令,但它没有正确处理诸如“ONAHAMA,JAPAN”之类的引号。

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

由于

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

2 个答案:

答案 0 :(得分:1)

可以使用sed解决此特定情况,但请查看perlpython等具有csv个模块的文件

$ 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代替
  • "[^"]+"$|[^,]*$最后一个字段在双引号内,否则为非,字符
  • ,&替换为,和匹配的文字

答案 1 :(得分:1)

gawk 解决方案:

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