大括号内的条件

use*_*329 1 awk

要对同一个输入文件进行多次传递,这个简单的情况可以正常工作:

$ awk 'p==1{print $1}; p==2{print $2}; p==3{print $3}' p=1 infile p=2 infile p=3 infile
Run Code Online (Sandbox Code Playgroud)

但这个改变失败了吗?

$ awk 'p==1{/Jan/ {print $1}}; p==2{print $2}; p==3{print $3}' p=1 infile p=2 infile p=3 infile
Run Code Online (Sandbox Code Playgroud)

我不想使用这样的术语:

p==1 && /Jan/ {print $1}
Run Code Online (Sandbox Code Playgroud)

因为我想保持(原始)代码的可读结构。

如何在每个括号内使用条件术语?

例子:

$ cat infile
James   Exeter 48
Alex    Leeds  22
Jan     London 35
Run Code Online (Sandbox Code Playgroud)

期望的结果:

Jan
Exeter
Leeds
London
48
22
35
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

/regexp/运算符是一个如果$0与正则表达式匹配则返回 1,否则返回 0 的运算符。

\n

print /foo/ + /bar/例如,您可以将其用作语句的一部分,或if (/foo/) print "match"或,但将其用作in的一部分是无效语法,同样的方式或在那里也是无效的。CONDITIONCONDITION { ACTION }ACTION/foo/ {something}a == b {something}"whatever" {something}

\n

你想要:

\n
awk '\n  p==1 {\n    if (/Jan/) print $1\n    next\n  }\n  p==2 {print $2; next}\n  p==3 {print $3; next}\n  ' p=1 infile p=2 infile p=3 infile\n
Run Code Online (Sandbox Code Playgroud)\n

另请注意next避免测试p==2p==3ifp==1匹配的调用。

\n

在这里,你也可以这样做:

\n
awk '{print $p}' p=1 infile p=2 infile p=3 infile\n
Run Code Online (Sandbox Code Playgroud)\n

或者仅打印/Jan/以下情况匹配的记录p==1

\n
awk 'p != 1 || /Jan/ {print $p}' p=1 infile p=2 infile p=3 infile\n
Run Code Online (Sandbox Code Playgroud)\n

$也是一个运算符,可以使用$por$ p$ (p * 2 - p)or $ (field_to_print = p),它们都调用$运算符来扩展到第 p字段\xc2\xb9。

\n

awk使用(也称为)的 GNU 实现gawk,您可以使用ARGIND为每个参数递增的 which 而不必p自己设置:

\n
gawk 'ARGIND != 1 || /Jan/ {print $ARGIND}' infile infile infile\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xc2\xb9 或整个记录(如果 p == 0)

\n