ファイルから行 n の前の x 行と行の後の y 行を削除 (一致するパターン)

ファイルから行 n の前の x 行と行の後の y 行を削除 (一致するパターン)

2行目が正規表現N +と一致する場合は、テキストファイルから4行のブロックを削除しようとします。テキストファイルは、次のように繰り返される4行形式で構成されています。

@HEADER1
ACTGCNNNT
+
583@#!NMY
@HEADER2
ANNTGCGGG
+
4123N@!&*

4ブロックパターンの最初の行は常に@で始まりますが、@は4行目のどこにでも現れることができます。

どんなアイデアにも大いに感謝します:)

答え1

sed -ne:n -e's/\n/&/3;tp'  \
          -e'$!{N;bn' -e\} \
     -e:p -e'/\n.*N.*\n/p' \
<in >out

入力内容が4行ごとに一般ブロックとして表示され、少なくとも1行を探している場合Nそれいいえこれらの4つのうち最後に発生した場合は、上記の事項がsedお客様のニーズに適している必要があります。入力ファイル全体が4行のグループに分割されているとします。そうでない場合は、お知らせください。コメントが少なくなります。

とにかく、最初にsed4つの入力ラインを収集するか、\nパターンスペース内の3つのライン区切り文字が見つかるまで入力ラインをドラッグしてから探します。N収集したばかりの4行の最初または最後の行では、この現象は発生しません。見つかった場合は、p4行のグループを印刷し、そうでない場合は何も印刷せず、次のサイクルは次の4行のグループで始まります。

しかし、明らかに、あなたは努力しています。削除する問題のブロック。この場合:

sed -e'$!N;/\n.*N/{$!N;$!N;d' -e'};n;n' <in >out

...動作します。まず、N外部入力ラインをパターンスペースに追加してから、パターンスペースがあることを確認します。N4行ブロックの2行目で発生し、見つかった場合は、ブロック全体を削除する前に、最後の行ではなく行にさらにsed2行をドラッグします。 2行目の場合!$dいいえマッチN、外部入力ラインでパターンスペースを2回上書きし、n自動的に最後のラインを印刷します。

もちろん、最後のアドレスの代わりにのsed最初の数字を使用することもできます。これは、関心のある他の行数に切り替えることで、ブロックあたりの行数をより簡単に変更できるため、有利です。/\n.*N.*\n/!pp3

答え2

Perlが救出に来る!

として保存してremove-blocks.plから実行しますperl remove-blocks.pl input_file > output_file

#!/usr/bin/perl
use strict;
use warnings;

my @four_lines;                      # Buffer to hold a block.
while (<>) {                         # Read the input line by line.
    if (@four_lines < 3) {           # Not reading the last line?
        push @four_lines, $_;        # Save it to the buffer.

    } else {
        print @four_lines, $_ if $four_lines[1] !~ /N+/;
        undef @four_lines;           # Clear the buffer.
    }
}

関連情報