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

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

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

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

答え2

私が取るのが最善です(行になることができます)

awk 'BEGIN { r["INTERACTS_WITH"]=1 ; r["COEXISTS_WITH"]=1} 
$2 in r {print $3,$2,$1 ; print ; next} 
{print}' ...

これはスペースをほとんど節約できません。

答え3

次のスクリプトを完成させる

awk '$2 ~ /INTERACTS_WITH|COEXISTS_WITH/ {$0=$3" "$2" "$1}1' filename

出力

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

答え4

printフィールドの順序を2回変更すると取得できます。{print $1, $2, $3}{print $3, $2, $1}

awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $1, $2, $3}{print $3, $2, $1}' file

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

またはもっと簡潔に言えば:

awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $0}{print $3, $2, $1}' file

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

関連情報