awk - 为什么 '-1' 在 Awk 中不起作用,而 '(-1)' 却可以?

标签 awk gnu gawk

我正在做一些数据过滤,发现有些奇怪。

众所周知,awk '1'awk '{print $0}' 的缩写,自 1计算结果为 True 并触发 Awk 上的默认操作,其中包括打印当前记录。

同样,awk '0'不打印任何内容,因为它的计算结果为 False。

$ seq 3 | awk '0'
                      # nothing
$ seq 3 | awk '1'
1
2                     # everything
3

所以我尝试了不同的方法,并注意到 awk '-1'给出错误,而 awk '(-1)'工作没有问题:

$ seq 3 | awk '-1'
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:      GNU long options: (standard)
...
        # all the gawk explanation on how to use it
...
$ seq 3 | awk '(-1)'
1
2                     # everything, since apparently
3                     # -1 evaluates to True

awk '-NF' 相同或awk '-NR'或任何其他以负号字符开头的表达式。

这是为什么?

我使用的是 GNU Awk 4.1.65,API:2.0。

最佳答案

seq 3 | awk '-1'

相同
seq 3 | awk -1

单/双引号可用于根据需要在命令行上构造参数,例如:

$ echo 'foo baz' | grep 'foo b'
foo baz
$ echo 'foo baz' | grep foo\ b
foo baz

$ echo 'foo:baz:123' | awk '-F:' '{print $1}'
foo
$ f='-F:'; echo 'foo:baz:123' | awk "$f" '{print $1}'
foo
$ var='$1'; echo 'foo:baz:123' | awk '-F:' "{print $var}"
foo

回到awk -1-1被视为一个选项(因为选项以--开头- 取决于工具)。 -1 不是有效选项,因此我们收到错误

大多数工具都有针对此类情况的解决方法,使用 -- 将指示没有进一步的选项

$ seq 3 | awk -- -1
1
2
3

更多示例:

$ # echo is fine with echoing non-options starting with -
$ echo '-1'
-1
$ echo '-1' | grep '-1'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
$ echo '-1' | grep -- '-1'
-1

$ echo 'Foo' | grep 'foo'
$ # using option at end depends on tool, I think it is GNU specific
$ echo 'Foo' | grep 'foo' -i
Foo
$ echo 'Foo' | grep -- 'foo' -i
grep: -i: No such file or directory

进一步阅读:Difference between terms: "option", "argument", and "parameter"?

关于awk - 为什么 '-1' 在 Awk 中不起作用,而 '(-1)' 却可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386526/

相关文章:

linux - 在一定条件下合并两个文件

c++ - 使用 MSYS : X11 not found 构建 GLEW

c++ - automake第三方库

c - GNU gdb 如何显示源文件名和符号行

linux - 在awk中根据其他数据过滤掉文件中的数据

linux - 提取包含两种模式的线

unix - 为什么一些 GNU 并行输入包含引号?

linux - Bash:从 ls -l 读取专栏

regex - 如何使用 sed、awk 或 gawk 只打印匹配的内容?

awk - 偷看下一行,但不要消费它