連続していないパターンを特定する方法...
このコマンドを実行します。
grep -B 1 -A 2 "field-2-value" inputFile.txt |grep -v "field-3"
この4つの出力を生成します。
[フィールド-1]xxx[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド-5]真[/フィールド-5] - [フィールド-1]yyy[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド4]フィールド4値[/フィールド4] - [フィールド-1]zzz[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド-5]偽[/フィールド-5] - [field-1]うーん[/field-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド4]フィールド4値[/フィールド4]
私はfield-2とfield-4の値を使用した2番目と最後の結果にのみ興味があります。
[フィールド-1]yyy[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド4]フィールド4値[/フィールド4] [field-1]うーん[/field-1] [フィールド2]フィールド2の値[/フィールド2] [フィールド4]フィールド4値[/フィールド4]
inputFile.txt は次のようになります。
[レコードID = "1"] [フィールド-1]xxx[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [field-3]こんにちは[/field-3] [フィールド-5]真[/フィールド-5] [/記録] [レコードID="2"] [フィールド-1]yyy[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [field-3]こんにちは[/field-3] [フィールド4]フィールド4値[/フィールド4] [/記録] [レコードID="3"] [フィールド-1]zzz[/フィールド-1] [フィールド2]フィールド2の値[/フィールド2] [field-3]こんにちは[/field-3] [フィールド-5]偽[/フィールド-5] [/記録] [レコードID="4"] [field-1]うーん[/field-1] [フィールド2]フィールド2の値[/フィールド2] [field-3]こんにちは[/field-3] [フィールド4]フィールド4値[/フィールド4] [/記録]
2つのワークセットを実行するシェルスクリプトを作成したいのです。まず、これらの結果を含む各ファイルに対して、これらの出力を含むファイルを生成します。次に、フィールド4を持たない行ブロックを削除します。助ける!
答え1
sed -ne '
/field-2-value/!{h;d;}
H;n;n;/field-4/!d;H;g;s/$/\n/p
' inputFile.txt
/field-2/ を含まないすべての行を拒否し、保存アクションに保存します。 (最後のもののみ保存可能)
したがって、/field-2/行が表示されたら、それを追加して保留し、次の行をスキップしてから、次の行に/field-4/が含まれていることを確認します。そうでない場合は、OTWに入れて保留に追加し、保留を外に移動し、印刷されたレコードが分離されるように末尾の改行を追加して印刷します。
結果:
[field-1]yyy[/field-1]
[field-2]field-2-value[/field-2]
[field-4]field-4-value[/field-4]
[field-1]mmm[/field-1]
[field-2]field-2-value[/field-2]
[field-4]field-4-value[/field-4]