如何从文件中删除每隔两行?

如何从文件中删除每隔两行?

文件:

Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred

预期输出文件:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

我希望输出看起来像这样:每隔一行将被删除,但行之间不会有间隙。

答案1

通过删除每隔一行来解决此问题可能很容易出错(例如,当进程有时生成两行而不是一行时)。也许最好过滤掉垃圾:

grep -v "No error occurred" file

它可以作为过滤器运行,您可以在此处添加更多垃圾模式并改进结果。

答案2

sed

sed -e n\;d <file

使用 POSIX awk

awk 'FNR%2' <file

如果您年龄较大awk(例如oawk),您需要:

oawk 'NR%2 == 1' <file

ex

$ ex file <<\EX
:g/$/+d
:wq!
EX

将就地编辑文件。

  • g标记全局命令
  • /$/匹配每一行
  • +d删除下一行
  • wq!保存所有更改

此方法与方法具有相同的理想sed,删除当前行从第 1 行开始的所有下一行。

perl

perl -ne 'print if $. % 2' <file

raku

raku -ne '.say if $*IN.ins % 2' <file
raku -ne '.say if ++$ % 2' <file

编辑

RakuIO::Handle.ins被删除于这次提交

答案3

根据这个问题,GNU sed

sed '0~2d' file

将删除每隔一行,但我想按其内容提供过滤行:

sed '/Data/! d' file

或具有相同的结果

sed '/No error/d' file

答案4

另一个答案,你可以使用 vi/vim!

qdjddq

然后,如果您的文件有 500 行(例如),请输入

250@天

然后写入并退出类型

:X

或者如果出现问题并且您不想保存:

:q!

解释:

q      #Start Recording
 d     #Put the recording into register 'd'
  j    #Move the cursor down
   dd  #Delete the line
     q #Stop recording


250    #Number of repeats
   @d  #Playback the recording in register 'd'.

相关内容