给定一个包含内容的文件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
)和一个$1 ~ /size/
计算结果为0
or 的表达式 () 1
。由于字符串连接,结果被视为字符串(“ 0
”或“ 1
”),并且如果其长度非零则为“true”。任一结果都有一个长度,因此图案条件被认为无条件为真。此时{
行动 }
被触发并且你被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
不是大写字母。
您可以找到更多示例这里。