8

我正在尝试使用这个 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

但得到:

awk: line 1: illegal reference to array a
4

3 回答 3

13

你的问题是这样的:

length(a)

使用 length(array) 来获取数组中元素的数量是 GNU awk 扩展,显然您没有使用 GNU awk。改变:

for(i=1;i<=length(a);i++)

for(i=1;i in a;i++)

它应该可以工作。

于 2013-06-04T16:57:18.433 回答
3

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

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

我解决了它sudo apt-get install gawk

于 2017-06-28T12:12:59.327 回答
1

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

awk -F: -f script.awk file1 file2

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

更新

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

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

{
    for (i in a) {
        if (match($0, a[i])) {
            print a[i], $1
        }
    }
}
于 2013-06-04T15:38:05.827 回答