我想在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
但通常这段代码不在工作状态。那我该怎么做呢?
答案 0 :(得分:0)
next
命令导致读取下一行并重新启动行处理序列。所以你的for循环永远不会超出它的第一次迭代,这将在每一行执行。