次のようなファイルがあるとしましょう。
John FRIEND_OF Jose
Aspirin INTERACTS_WITH Penicilin
Tree COEXISTS_WITH Grass
Andrew FIEND_OF Jane
John INTERACTS_WITH Paula
INTERACTS_WITH
2番目のフィールドが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