是否有命令行拼写可以删除 CSV 文件中的列?

Iva*_*van 35 text-processing

有一个包含以下内容的文件:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd
Run Code Online (Sandbox Code Playgroud)

我寻求获得与原始文件相同但缺少第 n 列的文件,例如,对于 n = 2(或者可能是 3)

1111,2222,4444
aaaa,bbbb,dddd
Run Code Online (Sandbox Code Playgroud)

或者,对于 n = 0(或者可能是 1)

2222,3333,4444
bbbb,cccc,dddd
Run Code Online (Sandbox Code Playgroud)

一个真正的文件可能有数千兆字节长,有数万列。

在这种情况下,我怀疑命令行魔术师可以提供一个优雅的解决方案...... :-)

在我实际的实际情况中,我需要删除 2 个第一列,这可以通过在序列中删除第一列两次来完成,但我认为概括一下会更有趣。

Sco*_*ung 49

我相信这是特定于从 GNU coreutils 中删除的:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd
Run Code Online (Sandbox Code Playgroud)

通常你通过 -f 指定你想要的字段,但是通过添加 --complement 你自然地颠倒了含义。从“人切”:

--complement
    complement the set of selected bytes, characters or fields
Run Code Online (Sandbox Code Playgroud)

一个警告:如果任何列包含逗号,它将抛出 cut off,因为 cut 不像电子表格那样是 CSV 解析器。许多解析器对如何处理 CSV 中的转义逗号有不同的想法。对于简单的 CSV 案例,在命令行上, cut 仍然是要走的路。

  • 只要它是一个简单的 CSV 文件,它就可以正常工作。如果任何列是一个带有逗号的字符串,它会抛出 `cut`,因为它不是 CSV 解析器。如果 CSV 字段的值中有字段分隔符,则它会用引号括起来。顺便说一句,关于 `cut` 的主题,`-f` 需要字段范围。`cut -f, -d3-` 将输出第三个字段,删除前两个字段。 (4认同)
  • 你的意思是 `cut -d, -f3-` (2认同)

Gil*_*il' 13

如果数据只是由逗号分隔的列组成:

cut -d , -f 1-2,4-
Run Code Online (Sandbox Code Playgroud)

您也可以使用 awk,但它有点尴尬,因为虽然清除字段很容易,但删除分隔符需要一些工作。如果您没有空字段,那还不错:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'
Run Code Online (Sandbox Code Playgroud)

如果您有实际的 CSV,如果正确引用逗号可以出现在字段中,则您需要一个真正的 CSV 库