如何从csv文件中删除多个重复行的行?

amw*_*ker 2 python unix csv sed

我正在使用csv文件,该文件是气相色谱数据分析仪的输出,因此我只能操作所提供的文件。我需要从csv文件中删除不必要的行或仅保留必要的行。实际文件中有960行。

文件中的第1 8行如下所示

[Line 1]  Remove
[Line 2]  Remove
[Line 3]  Keep
[Line 4]  Remove
[Line 5]  Remove
[Line 6]  Remove
[Line 7]  Keep
[Line 8]  Keep
Run Code Online (Sandbox Code Playgroud)

我要保留/删除的行范围的模式会持续数百行,因此这里以接下来的8行为例。

[Line 9]   Remove
[Line 10]  Remove
[Line 11]  Keep
[Line 12]  Remove
[Line 13]  Remove
[Line 14]  Remove
[Line 15]  Keep
[Line 16]  Keep
Run Code Online (Sandbox Code Playgroud)

没有字符串模式只能识别行号本身。我想避免不得不计算数百行的范围,并将它们全部放入sed中,如下面所示的脚本,该脚本仅针对前8行减少了所需的行数。

    sed '1,2d; 4,6d' test.csv >> cut_test.csv
Run Code Online (Sandbox Code Playgroud)

我希望以下几点:

[Line 3]  Keep
[Line 7]  Keep
[Line 8]  Keep
[Line 11] Keep
[Line 15] Keep
[Line 16] Keep
Run Code Online (Sandbox Code Playgroud)

All*_*lan 5

如果要保留的行号遵循您在说明中提供的确切模式(每8行重复一次),则可以使用以下GNU sed命令:

$ sed '1~8d;2~8d;4~8d;5~8d;6~8d;' input.csv 
[Line 3]  Keep
[Line 7]  Keep
[Line 8]  Keep
[Line 11]  Keep
[Line 15]  Keep
[Line 16]  Keep
Run Code Online (Sandbox Code Playgroud)

并将其重定向到新文件或用户-i.back以就地更改文件。

说明:

  • 1~8dd在第一行,第9行,...上执行命令
  • 2~8dd在第二行,第十行,...上执行命令

input.csv:

$ cat input.csv 
[Line 1]  Remove
[Line 2]  Remove
[Line 3]  Keep
[Line 4]  Remove
[Line 5]  Remove
[Line 6]  Remove
[Line 7]  Keep
[Line 8]  Keep
[Line 9]   Remove
[Line 10]  Remove
[Line 11]  Keep
[Line 12]  Remove
[Line 13]  Remove
[Line 14]  Remove
[Line 15]  Keep
[Line 16]  Keep
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过以下方式重新组合所有内容来简化命令(与您的命令接近):

$ sed '1~8,2~8d;4~8,6~8d;' input.csv 
[Line 3]  Keep
[Line 7]  Keep
[Line 8]  Keep
[Line 11]  Keep
[Line 15]  Keep
[Line 16]  Keep
Run Code Online (Sandbox Code Playgroud)

Thor所提到的,如果仅打印要保留的行而不是删除要删除的行,则可以减少命令:

$ sed -n '3~8p;7~8,8~8p;' input.csv
[Line 3]  Keep
[Line 7]  Keep
[Line 8]  Keep
[Line 11]  Keep
[Line 15]  Keep
[Line 16]  Keep
Run Code Online (Sandbox Code Playgroud)

  • 选择的时间更短,即用-n和脚本3〜8p运行;7〜8p; 8〜8p` (2认同)