awk:論理ORを介した式の結合

awk:論理ORを介した式の結合

2つのawk式を(論理的OR)結合したいと思います。どちらも別々にうまく機能します。最初の式は、検索語の前の行を印刷します。 2番目の式は、特殊文字を含む行のみを印刷します。 OR演算子を介して2つの式を結合すると、エラーが発生します。

^ 予期しない改行文字または文字列の終わり

'

awk '(({$0~/\*/; print a; a=$0}) || (/\→/))' file.txt

file.txt は次のようになります。

foo
*
bla
bla
bar→
bar→
foo
*
bla
bla
bar→
foo
*
bla
bar→
bar→

予想される結果:

foo
bar→
bar→
foo
bar→
foo
bar→
bar→

ベストアンサー1

説明に従って要件をお読みください。二つ様々な表現2つの異なる職業。あなたは言う:

First expression prints the line right before the search term
Second expression just prints the line that contains a special character

これは、両方の式をOR形式に結合できないことを意味します。 OR式と組み合わせて同じことを実行できます。

したがって、あなたの表現によると、正しい答えは次のようになります。

$ awk '/\*/{print a}{a=$0}/\→/' <<<"$a"
foo
bar→
bar→
foo
bar→
foo
bar→
bar→

2つの異なる条件で同じ操作を実行するためにOR条件を使用する必要がある場合は、次のようにすることもできます。

awk '/[*→]/{print a; a=$0}' file

おすすめ記事