Bash 可选变量传入awk&;分类

Bash 可选变量传入awk&;分类,bash,unix,awk,gawk,Bash,Unix,Awk,Gawk,我想使用可选变量传入awk 假设我有两个文件,我想打印匹配/取消匹配值,将一个或多个列值作为标识符键 file1 1 || 2 || 3 2 || 3 || 2 file 2 1 || 3 || 3 2 || 3 || 1 这是我正在使用的 您可以从这里找到一些类似的方法来获取匹配/不匹配的值。 这会打印出来 1 2 但是,如果您不想在print.awk中更改,您只想使用单个结构并传入多个变量,该怎么办 一个解决办法是 print.awk BEGIN{ n=split(a,Z,":")

我想使用可选变量传入awk

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

file1

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

file 2
1 || 3 || 3
2 || 3 || 1
这是我正在使用的 您可以从这里找到一些类似的方法来获取匹配/不匹配的值。

这会打印出来

1
2
但是,如果您不想在
print.awk
中更改,您只想使用单个结构并传入多个变量,该怎么办

一个解决办法是

print.awk

BEGIN{
n=split(a,Z,":"); FS="|"}{
for(i=1;i<=n;i++) 
printf $(Z[i]);
print "";}
如您所见,我在a中使用了拆分“:”分隔值来将变量a的值放入数组n中,然后访问这些值以获得结果

现在来看问题,假设场景是 1.文件1可能为空,因此无法使用FNR==NR 2.可能要访问多个列,但不能经常更改awk文件,这意味着肯定要考虑一个列号,但可能要考虑多个列号

为了测试这个逻辑,我使用上面的awk代码从file1和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

awk-vm=“1:3”'BEGIN{n=split(m,Z,“:”);FS=“[|]{2}”;OFS=“| |”}文件名==ARGV[1]{for(i=1;inext
命令导致读取下一行并重新启动行处理序列。因此,for循环将永远不会超过第一次迭代,它将对每一行执行。

orqui否此问题并非来自上一个问题,示例只是获取两个文件之间的不匹配值。&我只是认为与其为每个变量插入定义列标识,不如使用其他通用方法。编辑您的问题,解释“不匹配”的含义(正则表达式、字符串、数字或其他类型的比较?)并通过
标识符键号
显示给定输入的预期输出。顺便说一句,您将
{FILENAME==ARGV[1]
而不是
FILENAME==ARGV[1]{
-将条件放在操作块之外,而不是放在它里面。
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
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