AWK if 条件

wjw*_*yob 1 awk

给定一个包含内容的文件input.txt

xyMnZnMs76XHgsWJ
size: YN3hxFqFeUxXUMrQ
USPqYEnbquwFhUW7
vhJJduHZu25qHzTw
size: JaTDhQYQtLRWBLjj
uE5HGDAZN6DHU73Q
QxVPfQQaKTgR9LXQ
grnsm8bwSz5fJbQS size:
7CcuZxCHSJYhcdqg
ZuWadAaLWFwDwj5Z
Run Code Online (Sandbox Code Playgroud)

如何使用if (condition) {...} else {...}

我尝试使用:

xyMnZnMs76XHgsWJ
size: YN3hxFqFeUxXUMrQ
USPqYEnbquwFhUW7
vhJJduHZu25qHzTw
size: JaTDhQYQtLRWBLjj
uE5HGDAZN6DHU73Q
QxVPfQQaKTgR9LXQ
grnsm8bwSz5fJbQS size:
7CcuZxCHSJYhcdqg
ZuWadAaLWFwDwj5Z
Run Code Online (Sandbox Code Playgroud)

但所有行都匹配(即使是不$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
Run Code Online (Sandbox Code Playgroud)

我期望输出是:

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
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 13

让我们解释一下。

\n

的语法结构为awk\xc2\xab模式 { 操作 }\xc2\xbb,其中任一组件(但不能同时使用)是可选的。当您编写时,IF ($1 ~ /size/) { print "match: "$0; }您没有使用if关键字,而是实际上连接了一个空字符串(未设置的变量IF)和一个$1 ~ /size/计算结果为0or 的表达式 () 1。由于字符串连接,结果被视为字符串(“ 0”或“ 1”),并且如果其长度非零则为“true”。任一结果都有长度,因此模式条件被视为无条件为真。此时{ 动作 }被触发并且你被print "match: "$0执行。

\n

让我们修复一下。

\n

阅读文档awk(请参阅参考资料man awk),您会发现if\xe2\x80\xa6else结构是小写的。{ 此外,除了每个语句的 \xc2\xab操作 \xc2\xbb 部分之外,您不能使用这样的结构}

\n
awk -F: '\n    { if ($1 ~ /size/) { print "match:", $0 } else { print "non-match:", $0 } }\n' input.txt\n
Run Code Online (Sandbox Code Playgroud)\n

但是,请注意,您的行在grnsm8bwSz5fJbQS size:所需的输出中被视为不匹配,但在此代码中,它被视为匹配的输出。这是因为正则表达式/size/匹配第一个冒号分隔的字段grnsm8bwSz5fJbQS size。您需要识别字符串的开头和结尾以进行精确匹配 - 但更好的方法是将其作为文字字符串进行比较:

\n
awk -F: '\n    { if ($1 == "size") { print "match:", $0 } else { print "non-match:", $0 } }\n' input.txt\n
Run Code Online (Sandbox Code Playgroud)\n

或者,

\n
awk -F: '\n    $1 != "size" { print "non-match:", $0 }\n    $1 == "size" { print "match:", $0 }\n' input.txt\n
Run Code Online (Sandbox Code Playgroud)\n

甚至,

\n
awk -F: '\n    $1 != "size" { printf "non-" }\n    { print "match:", $0 }\n' input.txt\n
Run Code Online (Sandbox Code Playgroud)\n

  • 如果他们使用“if”(正确的小写形式),就会出现语法错误。这可能无法解释模式/动作语法以及必须将语句放在大括号内,但在某种程度上会更具描述性...... (3认同)