我需要读取一个文件并存储第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
答案 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存在于数组中,则将时间差加到总计中。最后,在读取所有文件后打印总计。