首页 > 解决方案 > 当需要保存函数的答案以在下一个文件中使用它时,如何在 AWK 中的多个文件上运行一个函数?

问题描述

我在 AWk 中编写了一个函数,它将打印两个矩阵的差异,例如 f1 包含这个矩阵:12 35 68 99 2 6 1 和 f2 包含:10 25 100 2 5 4 2 它将打印在一个名为 tmp 2 10 -32 的文件中99 0 1 4

代码是:

function matrix_difference(file1,file2) {
printf "" > "tmp"
for (o=1;o<=NR;o++){
for (x=1;x<=NF;x++){
d=A[file1,o,x]
p=A[file2,o,x]
sum=d-p
printf sum " ">> "tmp"
}
print "" >> "tmp"
}
close("tmp")
}

我试图在 AWK 中编写一个代码,该代码获取许多包含矩阵的文件并打印:“不同之处在于(每个名称之间带有 - 的文件名称)是:”它将打印所有文件中的差异。如果有四个文件。f1 f2 f3 f4 它打印 f1-f2-f3-f4 我试图编写代码,但它不能只对两个文件起作用,我试图做一个循环,但它不起作用。仅当我编写 matrix_difference(ARGV[1],ARGV[2]) 时,它才适用于两个文件。

#!/usr/bin/awk -f
{
for (i=1;i<=NF;i++)
A[FILENAME,FNR,i]=$i
}
{
if ( FNR ==1)
print "The matrix " FILENAME " is :"
print $0
}
END{
matrix_difference(ARGV[1],ARGV[2])
for ( m=1;m<=NR;m++){
getline x <"tmp"
print x 
}

print " The matrix difference A-B-C-D is:"
}
function matrix_difference(file1,file2) {
printf "" > "tmp"
for (o=1;o<=NR;o++){
for (x=1;x<=NF;x++){
d=A[file1,o,x]
p=A[file2,o,x]
sum=d-p
printf sum " ">> "tmp"
}
print "" >> "tmp"
}
close("tmp")
}

同样,当我编写 Matrix 的差异时,文件名也不知道该怎么做。

标签: linuxawk

解决方案


这是一个适用于多个文件的示例代码,在第一个文件之后,其他所有文件都将被减去。假设所有矩阵都有匹配的维度。

$ awk 'NR==FNR {for(i=1;i<=NF;i++) a[NR,i]=$i; next} 
               {for(i=1;i<=NF;i++) a[FNR,i]-=$i} 
       END     {for(i=1;i<=FNR;i++) 
                  for(j=1;j<=NF;j++) 
                     printf "%d%s",a[i,j],(j==NF?ORS:OFS)}' file1 file2

对于输入文件

==> file1 <==
1 2
3 4

==> file2 <==
1 0
0 1

脚本返回

0 2
3 3

尝试更多文件

$ awk '...' file1 file2 file2

-1 2
3 2

您可以转换为函数,不确定它是否有帮助!?

$ awk 'function sum(sign) {for(i=1;i<=NF;i++) a[FNR,i]+=sign*$i}

       NR==FNR {sum(+1); next} 
               {sum(-1)} 
       END     {for(i=1;i<=FNR;i++) 
                  for(j=1;j<=NF;j++) 
                    printf "%d%s",a[i,j],(j==NF?ORS:OFS)}' 

推荐阅读