要对同一个输入文件进行多次传递,这个简单的情况可以正常工作:
$ 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)
该/regexp/
运算符是一个如果$0
与正则表达式匹配则返回 1,否则返回 0 的运算符。
print /foo/ + /bar/
例如,您可以将其用作语句的一部分,或if (/foo/) print "match"
或,但将其用作in的一部分是无效语法,同样的方式或在那里也是无效的。CONDITION
CONDITION { ACTION }
ACTION
/foo/ {something}
a == b {something}
"whatever" {something}
你想要:
\nawk '\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==2
和p==3
ifp==1
匹配的调用。
在这里,你也可以这样做:
\nawk '{print $p}' p=1 infile p=2 infile p=3 infile\n
Run Code Online (Sandbox Code Playgroud)\n或者仅打印/Jan/
以下情况匹配的记录p==1
:
awk 'p != 1 || /Jan/ {print $p}' p=1 infile p=2 infile p=3 infile\n
Run Code Online (Sandbox Code Playgroud)\n$
也是一个运算符,可以使用$p
or$ p
或$ (p * 2 - p)
or $ (field_to_print = p)
,它们都调用$
运算符来扩展到第 p个字段\xc2\xb9。
awk
使用(也称为)的 GNU 实现gawk
,您可以使用ARGIND
为每个参数递增的 which 而不必p
自己设置:
gawk 'ARGIND != 1 || /Jan/ {print $ARGIND}' infile infile infile\n
Run Code Online (Sandbox Code Playgroud)\n\xc2\xb9 或整个记录(如果 p == 0)
\n