在awk&中传递的可选变量排序

时间:2015-06-03 13:09:54

标签: bash unix awk gawk

我想在awk中使用可选变量传递

假设我有两个文件,我想打印匹配/不匹配值,将一个或多个列值作为标识符键。

file1

1 || 2 || 3
2 || 3 || 2

file 2
1 || 3 || 3
2 || 3 || 1

这是我正在使用的 你可以找到一些类似的方法来从这里获得匹配/不匹配的值。 awk unmatched with blank file

awk -v a="1:3" 'BEGIN{n=split(a,Z,":"); FS="[|]{2}";OFS="||"}{FILENAME==ARGV[1] for(i=1;i<=n;i++){a[$(Z[i])]++;next} !($(Z[i]) in a) }' file1 file2

你可以看到而不是使用多个变量我正在回复一个变量

我之所以这样做,是因为我希望标识符的键号未定义,但是在这个中有一些错误。

我做错了什么?

更新: 由于您无法在此处跟踪我的问题,因此问题的更简化版本。

让我们说对于file1我想只打印第1列 所以命令将是

print.awk

BEGIN{ 
       FS="[|]{2}"; 
        OFS="||"}
        {
       print $var
       }

awk -v var=1 -f print.awk file1

这将打印

1
2

但是,如果你不想改变print.awk你只想使用单一结构&amp;传入多个变量

一个解决方案是

print.awk

BEGIN{
n=split(a,Z,":"); FS="|"}{
for(i=1;i<=n;i++) 
printf $(Z[i]);
print "";}

现在,如果我想要打印多个列,我可以简单地调用

awk -v a="1:3" -f print.awk file1

正如你所看到的,我已经使用了分隔a中的“:”分隔值来将变量a的值放入数组n&amp;然后访问值以获得结果。

现在问题,假设情景是 1.文件1可能为空,因此不能使用FNR == NR 2.可能有多个列要访问,但awk文件不能经常更改,这意味着将有一个列号可供考虑,但可能需要考虑多个

所以为了测试这个逻辑,我使用上面的awk代码来找到来自file1&amp;的匹配值。 file2的。

awk -v m="1:3" 'BEGIN{n=split(m,Z,":"); FS="[|]{2}";OFS="||"}FILENAME==ARGV[1] {for(i=1;i<=n;i++){a[$(Z[i])]++;next} !($(Z[i]) in a) }' file1 file2

但通常这段代码不在工作状态。那我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

next命令导致读取下一行并重新启动行处理序列。所以你的for循环永远不会超出它的第一次迭代,这将在每一行执行。