条件が満たされた場合、行を逆順に印刷

条件が満たされた場合、行を逆順に印刷

次のようなファイルがあるとしましょう。

John FRIEND_OF Jose
Aspirin INTERACTS_WITH Penicilin
Tree COEXISTS_WITH Grass
Andrew FIEND_OF Jane
John INTERACTS_WITH Paula

INTERACTS_WITH2番目のフィールドがorと一致する場合は、行を逆順に印刷する必要がありますCOEXISTS_WITH

私のAWK文は次のとおりです。

awk '{if ($2 == "INTERACTS_WITH" || $2 == "COEXISTS_WITH") print; print $3, $2, $1; next}1' test.txt

最終出力は次のとおりです。

Jose FRIEND_OF John
Aspirin INTERACTS_WITH Penicilin
Penicilin INTERACTS_WITH Aspirin
Tree COEXISTS_WITH Grass
Grass COEXISTS_WITH Tree
Jane FIEND_OF Andrew
John INTERACTS_WITH Paula
Paula INTERACTS_WITH John

しかし、上記の例のように、各条件を個別に指定するのは面倒です(特に条件がより多くの場合)。文字列配列(たとえば['INTERACTS_WITH', 'COEXISTS_WITH'])を作成し、2番目のフィールドが配列の要素と一致する場合は、その行を印刷する方法を知りたいです。

ベストアンサー1

あなたの入力/出力の例はせいぜい混乱しているので、実際に何をしたいのかわかりません。ただし、目的の値を文字列として指定し、それを使用して操作を実行する方法は次のとおりです。

awk '
    BEGIN {
        rels = "INTERACTS_WITH COEXISTS_WITH"
        split(rels,tmp)
        for (i in tmp) {
            relSet[tmp[i]]
        }
    }
    { print }
    $2 in relSet {
        print $3, $2, $1
    }
' file

おすすめ記事