【问题标题】:How to transform a csv file having multiple delimiters using awk如何使用 awk 转换具有多个分隔符的 csv 文件
【发布时间】:2017-03-02 10:49:00
【问题描述】:

以下是示例数据。请注意,需要对具有数百万条记录的文件执行此操作,因此我需要最佳方法。本质上,我们希望通过连接第 4 列的前两个字符并排除第 2 列的前 3 个字段('_' 分隔)来更新第 2 列。

我一直在尝试使用 cut 并逐行读取文件,这非常耗时。我需要 awk 之类的东西

awk -F, '{print $1","substr($4,1,2)"_"cut -f4-6 -d'_'($2)","$3","$4","$5","$6}'

输入数据:

234234234,123_33_3_11111_asdf_asadfas,01,06_1234,4325325432,2
234234234,123_11_2_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2
234234234,123_33_3_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2
234234234,123_33_3_11111_qewf_mkhsdf,01,09_68645,43234532,2

输出为:

234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2
234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2
234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2
234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2

【问题讨论】:

  • 请根据您的尝试编辑您的问题,以及有关问题所在的任何详细信息。评论部分不适合此类信息。
  • 另外,您确定 awk 与 Python 之类的脚本解决方案相比会特别有效吗?
  • 我更喜欢 awk,因为我们在需要转换此数据的服务器中没有 python。请注意,需要此转换的最大文件为 75 Gb

标签: shell csv awk


【解决方案1】:

您可以使用 awk 和 printf 重新格式化行

awk -F"[,_]" '{
    printf "%s,%s_%s_%s_%s,%s,%s_%s,%s,%s\n", $1,$9,$5,$6,$7,$8,$9,$10,$11,$12
}' file

你明白了,

234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2 234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2

【讨论】:

  • 这不适用于一般 CSV 文件。例如,如果一个字段本身包含一个逗号 - 在 CSV 格式中,这将通过将其括在引号中来写入,即....,"abc,def",...,awk 程序也会在这个逗号上拆分。顺便说一句,您的帖子标题具有误导性:您没有多个分隔符,而只有一个(逗号)。事实上,如果你有多个分隔符,这将不再被视为 CSV 格式。
  • @user1934428 我同意你的观点,xmljsonhtmlcsv 等格式,我建议使用专门的解析工具
猜你喜欢
  • 2021-05-22
  • 2021-10-13
  • 1970-01-01
  • 2011-06-03
  • 2022-01-13
  • 1970-01-01
  • 2018-01-15
  • 2022-01-11
  • 2021-06-25
相关资源
最近更新 更多