如何组合.csv文件中的前x列和后y列

时间:2014-07-25 18:56:25

标签: regex perl csv awk

我有一个.csv文件,我需要删除一个坏列。此列包含" extra"分隔符。所以第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是一个注释字段,一些记录在数据中有逗号,因此它会抛弃导入过程,因为它不会认为有45个字段,它认为有48或50个等。

所以我需要有前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

因此,我们将非常感谢任何进一步的建议。

由于

3 个答案:

答案 0 :(得分:2)

也许没有理解,而你的问题实际上是缺乏好的问题"属性,但尝试下一个:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

由于这是一行上的简单替换,只需使用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。