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行のグループに分割されているとします。そうでない場合は、お知らせください。コメントが少なくなります。
とにかく、最初にsed
4つの入力ラインを収集するか、\n
パターンスペース内の3つのライン区切り文字が見つかるまで入力ラインをドラッグしてから探します。N
収集したばかりの4行の最初または最後の行では、この現象は発生しません。見つかった場合は、p
4行のグループを印刷し、そうでない場合は何も印刷せず、次のサイクルは次の4行のグループで始まります。
しかし、明らかに、あなたは努力しています。削除する問題のブロック。この場合:
sed -e'$!N;/\n.*N/{$!N;$!N;d' -e'};n;n' <in >out
...動作します。まず、N
外部入力ラインをパターンスペースに追加してから、パターンスペースがあることを確認します。N
4行ブロックの2行目で発生し、見つかった場合は、ブロック全体を削除する前に、最後の行ではなく行にさらにsed
2行をドラッグします。 2行目の場合!
$
d
いいえマッチN
、外部入力ラインでパターンスペースを2回上書きし、n
自動的に最後のラインを印刷します。
もちろん、最後のアドレスの代わりにのsed
最初の数字を使用することもできます。これは、関心のある他の行数に切り替えることで、ブロックあたりの行数をより簡単に変更できるため、有利です。/\n.*N.*\n/!p
p
3
答え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.
}
}