linux - 当需要保存函数的答案以在下一个文件中使用它时,如何在 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 的差异时,文件名也不知道该怎么做。
解决方案
这是一个适用于多个文件的示例代码,在第一个文件之后,其他所有文件都将被减去。假设所有矩阵都有匹配的维度。
$ 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)}'
推荐阅读
- kotlin - 如何读取 int 以在 for 循环中使用?
- python - python 正则表达式中的转义括号
- python - 使用 numpy 将 BGR 图像转换为灰度
- node.js - git push heroku 显示 MERN 不支持 fsevents@2.3.2 的平台:想要 {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":" x64"})
- c - 在 fork() 之后使用 printf 并且父进程处于 wait() 时的意外行为
- sql - 如何使用 BYTES 类型的列来过滤 BigQuery 上的结果
- sql - ORDER BY before WHERE - 替代品?
- powerbi - 在power BI中通过多个条件搜索第二个最大值
- spring-boot - 如何在springboot中将@Value属性从application.properties注入@InjectMocks?
- c# - JWT Authentication .Net core [Authorize] 属性被控制器忽略