在特定条件下合并两个文件

时间:2016-12-21 18:26:46

标签: linux bash awk

文件1(大文件):

A B C TIMESTAMP  
4 4 4 12344653380  
5 5 5 12344653401  
6 6 6 12344653411  
7 7 7 12344653433  
8 8 8 12344653460  
9 9 9 12344653466 

文件2(小文件)(每30秒采样一次):

D E F TIMESTAMP  
1 1 1 12344653400  
2 2 2 12344653430  
3 3 3 12344653460  

文件3:

合并时间戳在文件2上的TIMESTAMP间隔之间的每一行

A B C TIMESTAMP   D E F   
5 5 5 12344653401 1 1 1  
6 6 6 12344653411 1 1 1  
7 7 7 12344653433 2 2 2  
8 8 8 12344653460 3 3 3  

我找到了很多这样的答案How to merge two files using AWK? 但他们总是专注于比赛。

2 个答案:

答案 0 :(得分:3)

请您试着跟随并告诉我这是否对您有帮助。

awk 'FNR==NR && FNR>1{MIN=MIN>$NF?NF:(MIN?MIN:$NF);MAX=MAX>$NF?MAX:$NF;next} ($NF>=MIN && $NF<=MAX)' file2 file1

你可以将上面的输出带到file3。

上述awk命令的说明:

awk 'FNR==NR && FNR>1{

FNRNR是2个awk的内置变量,它们会让我们知道任何文件的行数,因此NR变量的值会增加到最后一个文件正在阅读我们知道,awk一次可以读取多个文件,但与NR不同,FNR的值将在每个正在读取的新文件的开头重置。我给出条件FNR==NR,这意味着当读取第一个文件时,这个条件只会是TRUE。另外,我使用FNR>1来确保不应该读取文件2的第一行 - 因为它有标题而不是时间。因此,当这两个都是TRUE时,应该进行下一步行动。

MIN=MIN>$NF?NF:(MIN?MIN:$NF);

创建一个名为MIN的变量,如果MIN的值大于$NFawk中的最后一个字段,其中$,则该条件具有条件}表示字段的值,NF表示字段数)。如果此条件为TRUE,那么将执行野性字符?之后的操作,这会将MIN的值更改为$NF。如果该条件为NOT TRUE,则将执行:之后的操作/条件。所以,这里再次有一个条件可以检查MIN是否为NULL,然后将其值保持为$NF,否则保持MIN值。

MAX=MAX>$NF?MAX:$NF;

创建名为MAX的变量,并添加条件以检查MAX的值是否大于$NF的值,如果这是TRUE则行动在?之后,将保持MAX的值不变,将被执行。如果FALSE,那么:之后的操作(即将其值更改为$NF)将会被执行。

next}

在此处使用awk内置的关键字next,这意味着将所有后续语句保留下来,以便awk的光标移动到语句的开头。

($NF>=MIN && $NF<=MAX)

现在我们需要检查一个条件(仅在第一个文件名为file2被完全读取时执行),如上面next语句所述,这将不允许它执行这个条件。如果$NF的值大于或等于变量MIN的值且小于或等于MAX的值,请检查此处,然后打印当前行,尽管没有写入任何内容在这里打印awk适用于条件/操作,因此如果条件为TRUE,则应放置某些操作。此处未描述任何操作,因此将打印当前行的默认操作。

' file2 file1

在这里提到名为file2和file1的Input_files。

答案 1 :(得分:0)

试试这个:

  1. 将文件2读入数组(假设文件的数据按顺序排序 时间戳,如果不对数组进行排序)
  2. 逐行读取文件1(如果需要,按时间戳对其进行预排序);对于 每行,在数组上进行二进制搜索,找到掉落的行 在间隔中,将找到的行与文件1中的行合并