AWK需要读取一个文件,然后搜索另一个文件

时间:2019-02-26 15:27:51

标签: awk

我需要读取一个文件并存储第1列和第4列,使用第1列查找第二个文件并存储第二个文件的第4列,然后在文件01的第04列和文件2的第04列之间进行减法运算。你能帮助我吗?第04列以秒为单位。

这两个文件包含以下标题。

ID, origin, destination, time

我需要获取文件1中的第一个ID,然后查看文件2。

例如,从文件1中获取ID 37,然后查看文件2。找到它后,我需要从文件2中的ID 37时间中减去第一个文件中的ID 37时间。

我需要减法时间的总和。

想知道awk是否是正确的解决方法

文件01

37 33 44 602.04
39 32 13 602.20

文件02

37 44 44 602.184852493
39 13 13 602.263704529

输出

0,2

2 个答案:

答案 0 :(得分:0)

f1.col4-f2.col4:

awk 'NR==FNR{a[$1]=$4;next}{$4=a[$1]?a[$1]-$4:$4}7' f1 f2 

输出如下:

37 44 44 -0.144852
39 13 13 -0.0637045
41 44 44 -0.0642587
44 13 13 -0.0196296
45 44 44 -0.0145357
47 13 13 -0.014259

如果要使用f2.col4-f1.col4,请在上面的代码中使用$4-a[$1],您将得到:

37 44 44 0.144852
39 13 13 0.0637045
41 44 44 0.0642587
44 13 13 0.0196296
45 44 44 0.0145357
47 13 13 0.0142594

答案 1 :(得分:0)

要考虑的一种可能性是将任务分为两部分-根据该公共字段将两个文件合并,然后进行数学运算。这样就不必一次将一个文件中的每一行的一部分全部存储到内存中,如果它们很大,那就很好了。

以下内容假设a)文件是根据第一列进行排序的,b)使用制表符来分隔各列:

$ join -j1 -o '1.4 2.4' file1.txt file2.txt | awk '{total+=$2-$1} END {print total}'
0.208557

join命令在公共行上合并两个文件,并仅打印出您要减去的数字,这些数字通过管道传输到awk进行实际的数学运算。

编辑:或者全部awk:

$ awk 'NR==FNR { f1[$1]=$4; next }
       $1 in f1 { total += $4 - f1[$1] }
       END { print total }' file1.txt file2.txt
0.208557

这会将第一个文件的ID和时间存储在关联数组中,然后对于文件2中的每一行,如果该行的ID存在于数组中,则将时间差加到总计中。最后,在读取所有文件后打印总计。