AWK if 条件

AWK if 条件

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

相关内容