내용이 포함된 파일이 제공됩니다 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"입니다. 각 결과에는 길이가 있으므로0
1
0
1
무늬조건은 무조건 참인 것으로 간주됩니다. 이 시간에{
행동 }
트리거되고 print "match: "$0
실행됩니다.
문제를 해결해 봅시다.
awk
(참고자료 참조)에 대한 문서를 읽으면 ... 구조가 소문자 man awk
임을 알 수 있습니다 . 게다가, 내부 외에는 이러한 구조를 사용할 수 없습니다. «if
else
{
행동 }
» 각 문의 부분.
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
대문자가 아닙니다.
더 많은 사례를 찾아보실 수 있습니다여기.