おはようございます、
私は複数の繰り返しパターンがあり、その後に私が見つけたいパターンがあるファイルのUNIXスクリプトを書こうとしています。この質問は次のようによく似ています。
」他のパターンの前に最後に表示されるパターンを取得します。しかし、「tac」(または「tail -r」)がなく、String2とString2の前の最後のString1を返そうとします。
出力:
...
Condition 1: A
foo
Condition 1: B
foo
Condition 2: C
foo
Condition 1: D
foo
Condition 1: E
foo
Condition 2: F
...
次を返すgrep / sed / awkスクリプトを作成したいと思います。
Condition 1: B
Condition 2: C
Condition 1: E
Condition 2: F
条件1は常に条件2の上の「x」行なので、次のようにしてみました。
grep -B x "Condition 2"
そこで何らかの理由で結果スクリプト出力の2番目の発生が一番上で数行で停止するため(条件1は表示されません)、条件1/2の理由の間に空白行がある可能性があるため、わかりません。だからgrep -Bの使用を放棄しました。私は「戻る」grepできるので、tacが役に立つと思いましたが、私の環境にはtacコマンド(またはtail -r)はありません。
誰でも提案があれば大変感謝します。お時間をいただきありがとうございます。
答え1
まあ、うまくgrep
いかない場合は動作するawk
かどうかはわかりませんが、次のことを試すことができます。
awk '/Condition 1/ { acc = $0; } /Condition 2/ { print acc; print; }' input
答え2
代替条件に基づいてより一般的に使用されます(常にループ2-1にはありません)。最後の条件を記憶し、変更されたかどうかを比較し、変更された場合に覚えていない場合は、最後の条件行を印刷します。また、終了時に最後の記憶を印刷し、最初の条件が発生したときに記憶ループを開始します。
awk -F '[[:blank:]:]*'
/^Condition/ {
if (Index == $2) Last = $0
else if (Index ~ /^$/) Index = $2; Last = $0
elseprint Last
Index = $2
}
END { print Last }
' YourFile