1

私はこのようなtxtファイルを持っています:

# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# WR
ABABABABABABABABAB
BABABBABABABABABAA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA
# SL
AAABABABABABABBABA
AAABBABABABABABABA

SLとWRのデータをすべて削除したいと思います(例として)。だから私は持っているだけです:

# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA

何かを開始または含む1行を削除する方法は知っていますが、3行を続けて処理する方法がわかりません。

これは私が何かを含む行を削除するために使用するものです:

awk ' $2 !~ /SL/ && $2 !~ /WR/ ' test.txt > test_new.txt

3行すべてを一緒に削除する方法があるかどうか知りたかったのです。

4

3 に答える 3

3

awk印刷フラグを使用した純粋なソリューション( dogbaneに触発された):

$ awk '/^#/{p=1}/^# (SL|WR)/,/^#/{p=0}p' file
# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA

説明:

/^#/ {p=1}行がで始まる場合は#、印刷フラグpをに設定します1

/^# (SL|WR)/,/^#/{p=0}# SL行が開始範囲内にある場合、または# WR次の行開始までの範囲にある場合は#、印刷フラグを次のように設定します。0

p印刷フラグがゼロ以外の場合、デフォルトのブロックが実行され、{print}それ以外の場合は0何も印刷されません。

SLここでは順序が重要です。最初に、新しいレコードごとに印刷フラグがオンになり、レコードと。に対してのみオフになりWRます。


使用record seperators

変数を設定することrecordで、aが何であるかを再定義できます。デフォルトでは、各レコードは改行で区切られますが、この例では、withをレコード区切り文字として使用し、最初のフィールドがそうでないレコードのみを出力できます。awkRS#WRSL

$ awk '$1 != "SL" && $1 != "WR"' RS=# ORS=# file
# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA
#

このアプローチの小さな問題は、最後のレコード区切り文字です。簡単な修正は、次の場所にパイプすることsed '$d'です。

$ awk '$1 != "SL" && $1 != "WR"' RS=# ORS=# file | sed '$d'
# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA

注:変数ORSは出力レコード区切り文字であり、これを設定#して出力に表示されるようにする必要があります。

于 2013-03-15T10:56:34.460 に答える
3

使用sed:

削除するには# WR:

sed -e '/^# WR/,/^#/ {/^# WR/d;/^#/!d}' file

# WR# SLブロックの両方を削除するには:

$ sed -e '/^# WR/,/^#/ {/^# WR/d;/^#/!d}' -e '/^# SL/,/^#/ {/^# SL/d;/^#/!d}' file

# RIR1
ABABABABABABABABAA
ABABABABABABABABBA
# BR2
ABABABABABABABBABA
ABBABABABABABABABA

または、sudo_O が示唆するように:

sed -r '/^# (WR|SL)/,/^#/ {/^# (WR|SL)/d;/^#/!d}' file
于 2013-03-15T11:22:47.417 に答える
0

ファイルの前処理:

awk '/#/{print x}1' file | awk '$2!="SL" && $2 !="WR"' RS=
于 2013-03-15T11:00:10.130 に答える