如何使用 AWK 在 CSV 文件的特定位置插入一列并处理引号?
How to insert a column at a certain position in a CSV file using AWK and dealing with quotes?
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
我正在尝试在此 table 的倒数第二个字段中在此 table 中插入一个空列。因此,例如 header 将如下所示:
msg_type,mmsi,timestamp,imo,name,ship_and_cargo_type,length,width,draught,eta_date,,destination
我正在使用 AWK 命令,但它无法正确处理诸如“ONAHAMA,JAPAN”之类的引号。
有没有更好的方法,我该如何克服这个问题?这是我的尝试。
谢谢
awk -F, -v OFS="," '{print ,,,,,,,,,,","}' old_table > new_table
这种特殊情况可以用 sed
解决,但请查看 perl
、python
等具有 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
而不是
"[^"]+"$|[^,]*$
最后一个字段在双引号内,否则非 ,
字符
,&
替换为 ,
和匹配的文本
gawk 解决方案:
awk -v FPAT='"[^"]+"|[^,]+' '{print ,,,,,,,,,,","}' OFS=',' old_table > new_table
v FPAT='"[^"]+"|[^,]+'
- 模式定义字段值
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
我正在尝试在此 table 的倒数第二个字段中在此 table 中插入一个空列。因此,例如 header 将如下所示:
msg_type,mmsi,timestamp,imo,name,ship_and_cargo_type,length,width,draught,eta_date,,destination
我正在使用 AWK 命令,但它无法正确处理诸如“ONAHAMA,JAPAN”之类的引号。
有没有更好的方法,我该如何克服这个问题?这是我的尝试。
谢谢
awk -F, -v OFS="," '{print ,,,,,,,,,,","}' old_table > new_table
这种特殊情况可以用 sed
解决,但请查看 perl
、python
等具有 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
而不是"[^"]+"$|[^,]*$
最后一个字段在双引号内,否则非,
字符,&
替换为,
和匹配的文本
gawk 解决方案:
awk -v FPAT='"[^"]+"|[^,]+' '{print ,,,,,,,,,,","}' OFS=',' old_table > new_table
v FPAT='"[^"]+"|[^,]+'
- 模式定义字段值