다음과 같은 파일이 있다고 가정해 보겠습니다.
John FRIEND_OF Jose
Aspirin INTERACTS_WITH Penicilin
Tree COEXISTS_WITH Grass
Andrew FIEND_OF Jane
John INTERACTS_WITH Paula
INTERACTS_WITH
두 번째 필드가 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']
)을 생성한 다음 두 번째 필드가 배열의 요소와 일치하면 해당 줄을 인쇄하는 방법을 알고 싶습니다 .
답변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
필드 순서를 두 번 변경하면 얻을 수 있습니다 .{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