首页 > 解决方案 > 删除列 csv 文件,其中一些包含带引号的文本,包括逗号

问题描述

我有一个包含数百列和 80 行的 csv 文件。我需要从文件中删除前 13 列。我试过使用:

cut -d, -f1-13 -- 补码 input.csv > output.csv

但问题是第一列中的一个包含带引号的文本,包括逗号,并且 cut 无法处理这种格式。示例输入:

标头A,标头B,标头C,标头D,标头E,标头F,标头G,标头H A,“B,B”,C,“D,D,D,D”,E,F,G,H A,“B,B”,C , "D, D, D, D", E, F, G, H A, "B, B", C, "D, D, D, D", E, F, G, H

期望的输出:

标头E, 标头F, 标头G, 标头H E, F, G, H E, F, G, H E, F, G, H

在示例中,我在类似条件下使用较少数量的列。理想情况下,该解决方案应该可以扩展到任意数量的列和行(在我的例子中是 13 列和 80 行)。我曾尝试使用 awk 寻找解决方案,但它们通常包括打印除要删除的列之外的所有列,并且由于列的数量众多,这不是一个实际的解决方案。

标签: linuxbashcsv

解决方案


考虑到您设定的特定条件,这样的事情会起作用:

grep -oE '(("[^"]+"|[^,]+),?){5}$' input.csv > output.csv

其中5in{5}替换为您想要剩余的列数。因此,给定N列,其中前 13 列将被省略,该值将是N - 13

注意: 如果任何引用的列数据本身包含引号,例如 ,则正则表达式将无法正确匹配"some \"data\" in quotes",尽管可以调整模式以适应这种情况(但它变得相当复杂)。


推荐阅读