awk:非法引用数组a

use*_*340 6 awk

我正在尝试使用此awk命令:

awk -F: '
FILENAME==ARGV[1] { 
    a[FNR]=$1
}
FILENAME==ARGV[2] { 
    for(i=1;i<=length(a);i++) { 
        if(match($0,a[i])) { 
            print a[i],$1
        }
    }
}' 16.passwd 16.group | sort
Run Code Online (Sandbox Code Playgroud)

但得到了:

awk: line 1: illegal reference to array a
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 11

你的问题是这样的:

length(a)
Run Code Online (Sandbox Code Playgroud)

使用length(array)来获取数组中元素的数量是一个GNU awk扩展,显然你没有使用GNU awk.更改:

for(i=1;i<=length(a);i++)
Run Code Online (Sandbox Code Playgroud)

for(i=1;i in a;i++)
Run Code Online (Sandbox Code Playgroud)

它应该工作.

  • PS:为了补充这个用于循环顺序索引数组的优雅解决方案,其中一个用于计算任何数组的元素:`for (k in a) ++count`。 (2认同)

Geo*_*lin 5

我得到了这个问题。脚本在旧服务器上运行并停止在新服务器上运行。

问题是旧服务器安装了“gawk”,而新服务器安装了“mawk”,它不支持阵列。

我通过解决了它sudo apt-get install gawk


Hai*_* Vu 1

就语法而言,我没有发现您的脚本有任何问题。我将您的代码保存在名为script.awk的文件中,并执行:

awk -F: -f script.awk file1 file2
Run Code Online (Sandbox Code Playgroud)

并没有看到任何错误。为什么不尝试同样的操作:将脚本放在单独的文件中并对其调用 awk 。如果您仍然遇到同样的问题,我怀疑问题可能出在数据文件中。

更新

我稍微清理了一下代码,新版本可能更容易阅读:

FNR==NR {a[FNR] = $1; next}

{
    for (i in a) {
        if (match($0, a[i])) {
            print a[i], $1
        }
    }
}
Run Code Online (Sandbox Code Playgroud)