AWK - 带有计数变量的脚本中的错误或 AWK 实现/版本中的错误?

标签 awk gnu openvms

  • awk 版本:GNU Awk 3.1.1
  • 平台:OpenVMS 8.4-L1
  • awk 知识:有限

脚本(Awk 一行)。 注意:OpenVMS参数解析需要引号

gawk "-F" ";" "BEGIN {x = 0} ; x++ {print $0,$1"";""x}" in.file > out.file

**in.file**
file.log;2000
file.log;1999
file.log;1998
file.log;1997

**out.file**
file.log;1999 file.log;2
file.log;1998 file.log;3
file.log;1997 file.log;4

我想要以下内容

file.log;2000 file.log;1
file.log;1999 file.log;2
file.log;1998 file.log;3
file.log;1997 file.log;4

如果我将上面的 awk 命令更改为:...{x = -1}...我得到

**out.file**
file.log;2000 file.log;0
file.log;1998 file.log;2
file.log;1997 file.log;3

我想知道的是

  1. 其他人可以使用不同的平台对此进行测试,看看它是否会产生相同的输出?
  2. 是否是我正在运行的 awk 版本有问题,或者我的 awk 脚本存在我不理解的问题

在我看来,它确实应该生成 file.log;1999 file.log;1 行,但事实并非如此。我不知所措,需要一些指导/awk 教育

提前致谢:-)

最佳答案

您需要使用++x 代替x++x++ 最初的计算结果为 0(但将 x 增加到 1),并且 0 为 false,因此不执行该操作;第一行没有打印任何内容。

当您将 x 初始化为 -1 时,会打印第一行,因为 x++ 的计算结果为 -1这是真的;第二个被跳过,因为 x 为 0 等。

您不需要 BEGIN block 。变量自动以零(或空字符串)作为值。事实上,你不需要根据 x 是否为零来触发打印;您只想始终打印 x 的增量值。

因此,在 Mac(类 Unix)系统上,我可以运行:

$ gawk "-F" ";" '{print $0,$1";"++x}' file.in
file.log;2000 file.log;1
file.log;1999 file.log;2
file.log;1998 file.log;3
file.log;1997 file.log;4
$

转换为 VMS 约定,即:

gawk "-F" ";" "{print $0,$1"";""++x}" file.in

关于AWK - 带有计数变量的脚本中的错误或 AWK 实现/版本中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43132458/

相关文章:

c - 无法链接预编译文件

assembly - Openvms/Itanium 程序集示例中的 "Hello World"?

linux - 使用 awk 更改文件的特定行

classpath - 如何构建 GNU 类路径和 JamVM

python - sed 不适用于大文件[寻找其他选项]

c - UDP C 套接字 : Multiple Sockets Sharing Single Port

c++ - 如何在 unsigned int 和 int 之间安全地进行 static_cast?

linux - 如何使用 awk 交换和删除列而不获取换行符和空格?

linux - 从一个巨大的(有数百万条记录和列)OFS 文件(没有固定标题行)unix 中查找所有唯一列

Linux Grep 可能是简单的答案