조건이 있는 경우 AWK

조건이 있는 경우 AWK

내용이 포함된 파일이 제공됩니다 input.txt.

xyMnZnMs76XHgsWJ
size: YN3hxFqFeUxXUMrQ
USPqYEnbquwFhUW7
vhJJduHZu25qHzTw
size: JaTDhQYQtLRWBLjj
uE5HGDAZN6DHU73Q
QxVPfQQaKTgR9LXQ
grnsm8bwSz5fJbQS size:
7CcuZxCHSJYhcdqg
ZuWadAaLWFwDwj5Z

사용하는 방법 if (condition) {...} else {...}?

나는 다음을 사용하려고합니다 :

awk -F ':' '
IF ($1 ~ /size/) {
    print "match: "$0;
} ELSE {
    print "non-match: "$0;
}' input.txt

그러나 모든 행은 일치합니다( $1를 포함하지 않는 행도 포함 "size").

match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
match: USPqYEnbquwFhUW7
match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
match: uE5HGDAZN6DHU73Q
match: QxVPfQQaKTgR9LXQ
match: grnsm8bwSz5fJbQS size:
match: 7CcuZxCHSJYhcdqg
match: ZuWadAaLWFwDwj5Z

내 예상 결과는 다음과 같습니다

non-match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
non-match: USPqYEnbquwFhUW7
non-match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
non-match: uE5HGDAZN6DHU73Q
non-match: QxVPfQQaKTgR9LXQ
non-match: grnsm8bwSz5fJbQS size:
non-match: 7CcuZxCHSJYhcdqg
non-match: ZuWadAaLWFwDwj5Z

답변1

설명해 보겠습니다.

의 문법 구조는 awk다음과 같습니다. «무늬 { 행동 }», 두 구성 요소 중 하나(둘 다는 아님)는 선택 사항입니다. 작성할 때 키워드를 IF ($1 ~ /size/) { print "match: "$0; }사용하는 대신 if실제로 빈 문자열(설정되지 않은 변수 IF)과 or() $1 ~ /size/로 평가되는 표현식을 연결합니다 . 문자열 연결로 인해 결과는 문자열(" " 또는 " ")로 처리되며 길이가 0이 아닌 경우 "true"입니다. 각 결과에는 길이가 있으므로0101무늬조건은 무조건 참인 것으로 간주됩니다. 이 시간에{ 행동 }트리거되고 print "match: "$0실행됩니다.

문제를 해결해 봅시다.

awk(참고자료 참조)에 대한 문서를 읽으면 ... 구조가 소문자 man awk임을 알 수 있습니다 . 게다가, 내부 외에는 이러한 구조를 사용할 수 없습니다. «ifelse{ 행동 }» 각 문의 부분.

awk -F: '
    { if ($1 ~ /size/) { print "match:", $0 } else { print "non-match:", $0 } }
' input.txt

그러나 귀하의 행은 grnsm8bwSz5fJbQS size:원하는 출력에서는 일치하지 않는 것으로 간주되지만 이 코드에서는 일치하는 출력으로 간주됩니다. 이는 정규 표현식이 /size/콜론으로 구분된 첫 번째 필드와 일치하기 때문입니다 grnsm8bwSz5fJbQS size. 정확하게 일치하려면 문자열의 시작과 끝을 식별해야 하지만 더 좋은 방법은 리터럴 문자열로 비교하는 것입니다.

awk -F: '
    { if ($1 == "size") { print "match:", $0 } else { print "non-match:", $0 } }
' input.txt

또는,

awk -F: '
    $1 != "size" { print "non-match:", $0 }
    $1 == "size" { print "match:", $0 }
' input.txt

심지어,

awk -F: '
    $1 != "size" { printf "non-" }
    { print "match:", $0 }
' input.txt

답변2

나는 이것에 a를 사용하지도 않을 것입니다 if-statement. 그들은 더 복잡한 것들을 위한 것입니다. 다음을 사용할 수 있습니다.

awk -F':' '/^size/ {print "match: " $0} !/^size/ {print "non-match: " $0}' input.txt

pat또는 내가 선호하는 방법은 나중에 더 쉽게 변경할 수 있도록 이름이 지정된 변수를 사용하여 이 작업을 수행하는 것입니다 .

awk -v pat="size" -F':'  '$1~pat {print "match: " $0}; $1!~pat {print "non-match: " $0}' input.txt

답변3

이것은 나에게 효과적입니다.
awk -F: '{if ($1 =="size") {print "match: "$0} else {print "non-match: "$0}}'

의 경우 awk항상 코드에 중괄호를 사용해야 합니다. 예를 들면 다음과 같습니다.

awk '{ your code }'

또한 if/는 else대문자가 아닙니다.
더 많은 사례를 찾아보실 수 있습니다여기.

관련 정보