【问题标题】:How can I combine the first x columns and the last y columns in a .csv file如何在 .csv 文件中组合前 x 列和最后 y 列
【发布时间】:2014-09-17 17:15:57
【问题描述】:

我有一个 .csv 文件,我需要在其中删除一个坏列。此列包含“额外”分隔符。所以第 10 列的内容中有逗号。它们不是双引号。所以我需要将前 9 列与后 33 列结合起来。这样,由于在第 10 列中使用逗号而导致的行上的“额外”列将被删除。 谁能给我一个 awk、cut、perl 的正则表达式示例,任何可以让我“修复”这些不良数据的东西?

谢谢

这是我所拥有的:

field1,field2,field3,field4,field5,field6,field7,field8,field9,field10,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27,field28,field29,field30,field31,field32,field33,field34,field35,field36,field37,field38,field39,field40,field41,field42,field43,field44,field45

field10 是一个注释字段,一些记录在数据中有逗号,因此它会抛出导入过程,因为它认为有 48 个或 50 个等而不是认为有 45 个字段。

所以我需要前 9 个字段,后面还有 35 个字段。 我尝试了 Ed 的答案,但它没有“剪切”并正确组合

$ sed -r 's/(([^,]+,){9}).*(([^,]+,){33}[^,]+)$/\1\3/' headers.example.csv 
field1,field2,field3,field4,field5,field6,field7,field8,**field9,2,field13**,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27,field28,field29,field30,field31,field32,field33,field34,field35,field36,field37,field38,field39,field40,field41,field42,field43,field44,field45

所以任何进一步的建议将不胜感激。

谢谢

【问题讨论】:

  • 发布一些示例以及您尝试解决的问题。
  • 如果您遵循@Jotne 的建议,并为我们提供您正在使用的文件中的几行代码以及您想要的输出示例,这将更容易为您提供帮助。仅凭描述很难形象化。

标签: regex perl csv awk


【解决方案1】:

可能没理解对,你的问题确实缺乏“好问题”的属性,不过试试下一个:

csv="./bad_csv_file.csv"
paste  -d, <(cut -d, -f 1-9 "$csv") <(rev "$csv" | cut -d, -f1,33 | rev) > new_csv.csv

【讨论】:

    【解决方案2】:

    如果我理解正确,您想打印前 10 列和后 33 列。你可以用 awk 做到这一点:

    BEGIN { FS=","; ORS=" " }
    { for (i = 1; i <= 10; i++)
          print $i
      for (i = NF-32; i<=NF; i++)
          print $i
    }
    

    【讨论】:

      【解决方案3】:

      由于这是单行的简单替换,只需使用 sed:

      $ sed -r 's/(([^,]+,){9}).*,(([^,]+,){34}[^,]+)$/\1\3/' file
      field1,field2,field3,field4,field5,field6,field7,field8,field9,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27,field28,field29,field30,field31,field32,field33,field34,field35,field36,field37,field38,field39,field40,field41,field42,field43,field44,field45
      

      当然,如果您愿意,可以在 awk 或 perl 中使用相同的 RE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 2017-12-04
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        相关资源
        最近更新 更多