私のファイルには、次のように何百万ものレコードがあります。
echo "NEW Cell"
grep "2553,24" out.2A25.20090308.64436.7.HDF.txt.text = 22.58 5.39 82.09 237
echo "NEW Cell"
grep "2555,20" out.2A25.20090308.64436.7.HDF.txt.text = 24.72 5.58 82.05 237
echo "NEW Cell"
grep "2557,20" out.2A25.20090308.64436.7.HDF.txt.text = 19.75 5.62 82.11 170
grep "2557,21" out.2A25.20090308.64436.7.HDF.txt.text = 24.34 5.58 82.13 120
grep "2558,22" out.2A25.20090308.64436.7.HDF.txt.text = 22.2 5.57 82.19 120
echo "NEW Cell"
grep "2560,22" out.2A25.20090308.64436.7.HDF.txt.text = 24.69 5.62 82.25 160
grep "2561,23" out.2A25.20090308.64436.7.HDF.txt.text = 24.74 5.60 82.30 120
echo "NEW Cell"
grep "2560,24" out.2A25.20090308.64436.7.HDF.txt.text = 19.38 5.54 82.30 170
echo "NEW Cell"
「New Cell」を含む行間の唯一の行という条件で、「grep」のある行を削除したいと思います。つまり、grepに新しいセル間に行がある場合は、この行を削除する必要があります。
どうすればいいですか?
私の出力は次のようになります
echo "NEW Cell"
grep "2557,20" out.2A25.20090308.64436.7.HDF.txt.text = 19.75 5.62 82.11 170
grep "2557,21" out.2A25.20090308.64436.7.HDF.txt.text = 24.34 5.58 82.13 120
grep "2558,22" out.2A25.20090308.64436.7.HDF.txt.text = 22.2 5.57 82.19 120
echo "NEW Cell"
grep "2560,22" out.2A25.20090308.64436.7.HDF.txt.text = 24.69 5.62 82.25 160
grep "2561,23" out.2A25.20090308.64436.7.HDF.txt.text = 24.74 5.60 82.30 120
答え1
AWK
解決策:
awk 'NR==n{ if (/NEW Cell/) { f=0 } else print r ORS gr }
/NEW Cell/{ f=1; n=NR+2; r=$0; next }
f && n-NR==1 && /^grep /{ gr=$0; next }1' file
/NEW Cell/{ f=1; n=NR+2; r=$0; next }
- 行に会ったときNEW Cell
f=1
=アクティビティフラグの設定f=1
n=NR+2
-n
処理する最大次の行数を設定します(次の2行)。r=$0
- キャプチャラインnext
- 次のレコードに移動
f && n-NR==1 && /^grep /
-n-NR==1
キーワードで始まる2行目に会いましょう(保証)grep
gr=$0; next
-grep
行をキャプチャして次の(3番目)レコードに移動
NR==n{ if (/NEW Cell/) { f=0 } else print r ORS gr }
- 3番目のクリティカルラインに会ったとき(保証NR==n
)if (/NEW Cell/) { f=0 }
- 処理されたセクションの下の行3に以下が含まれている場合NEW Cell
- 現在の処理をリセットするf=0
(以前にキャプチャされたすべての行をスキップ)else print r ORS gr
- それ以外の場合は、以前にキャプチャしたすべての行を印刷します。
出力:
echo "NEW Cell"
grep "2557,20" out.2A25.20090308.64436.7.HDF.txt.text = 19.75 5.62 82.11 170
grep "2557,21" out.2A25.20090308.64436.7.HDF.txt.text = 24.34 5.58 82.13 120
grep "2558,22" out.2A25.20090308.64436.7.HDF.txt.text = 22.2 5.57 82.19 120
echo "NEW Cell"
grep "2560,22" out.2A25.20090308.64436.7.HDF.txt.text = 24.69 5.62 82.25 160
grep "2561,23" out.2A25.20090308.64436.7.HDF.txt.text = 24.74 5.60 82.30 120
答え2
コンパクトソリューションsed
:
sed '/NEW Cell/!{H;d;};x;/\n.*\n/!d'
NEW Cell
行に実行がない場合は、予約済みH
スペースに行を追加してd
行の処理を停止します。
NEW Cell
したがって、追加のコマンドは行にのみ適用されます。x
つまり、パターンスペースとホールドスペースが変わるため、ラインはホールドスペースにあり、さらに多くのラインを追加でき、パターンスペースには最後のラインに追加されたすべてが含まれますNEW Cell
。あなたの要件は行の間に2つ以上の行を持つ必要があるため、NEW Cell
パターンスペースに2つ以上の改行が必要です。それ以外の場合は削除して出力しないでください/\n.*\n/!d
。
答え3
基本的にawk
...
grep
バージョン1では、OPの説明の後の行のみを削除します。
awk '/^grep/ { if (f) { if (length(s) > 0) { print s; s="" } print } \
else { f=1; s=$0 } } ! /^echo/ { print; f=0 } \
! /^echo/ && ! /^grep/ { print }' inputfile
grep
バージョン2は、OPの出力例に従う前の非grep行だけでなく、単一行も削除します。
awk '/^grep/ { if (f) { if (length(s) > 0) { print s; s="" } print } \
else { f=1; s=s "\n" $0 } } /^echo/ { s=$0; f=0 } \
! /^echo/ && ! /^grep/ { print }' inputfile
人間が読める形式のバージョン2 ...
/^grep/ {
if (found) { # found==true : already encountered first grep line
if (length(save) > 0) {
print save
save=""
}
print
} else {
found=1
save=save "\n" $0 # append the first grep line to saved preceding line
}
}
/^echo/ {
save=$0 # save this line for possible later printing
found=0
}
# print anything else
! /^echo/ && ! /^grep/ { print }
この長い形式は、awkfile
コンテンツをファイル(たとえば)に入れ、awk -f awkfile inputfile
。
答え4
gawk '
/\n.+\n/{
printf("%s%s", RS, $0);
}' RS='echo "NEW Cell"\n' input.txt
説明する:
RS='echo "NEW Cell"\n'
-RS
入力レコードの区切り文字で、デフォルトは改行です。代わりに、echo "NEW Cell"\n
その文字列のすべての項目が削除され、その間のすべての文字がレコード項目になります。/\n.+\n/{
- 改行、1つ以上の文字、改行など、このパターンに一致するレコードにのみ適用されます。したがって、複数行のレコードのみが一致し、1行のレコードは1つしかないため、一致しません\n
。printf("%s%s", RS, $0);
RS
- () 前に記録を印刷しますecho "NEW Cell"\n
。
出力
echo "NEW Cell"
grep "2557,20" out.2A25.20090308.64436.7.HDF.txt.text = 19.75 5.62 82.11 170
grep "2557,21" out.2A25.20090308.64436.7.HDF.txt.text = 24.34 5.58 82.13 120
grep "2558,22" out.2A25.20090308.64436.7.HDF.txt.text = 22.2 5.57 82.19 120
echo "NEW Cell"
grep "2560,22" out.2A25.20090308.64436.7.HDF.txt.text = 24.69 5.62 82.25 160
grep "2561,23" out.2A25.20090308.64436.7.HDF.txt.text = 24.74 5.60 82.30 120