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



文件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

的时间戳间隔之间
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  

我找到了很多这样的答案,如何使用尴尬合并两个文件?但是他们总是专注于比赛。

您可以尝试以下内容,让我知道这是否对您有帮助。

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的in内置在关键字 next中,这意味着将所有下一个语句留下更多,因此awk的光标将移至语句的开头。

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

现在,我们需要检查一个条件(只有在完全读取文件2的第一个文件时才会执行),如next语句所述,这将不允许其执行此条件。在此处检查$NF的值是否更大或等于变量MIN的值,而较小或等于MAX的值,然后打印当前行,尽管在此处没有任何书面打印。awk在条件/操作上工作,因此,如果条件为TRUE,则应放置某些动作。此处没有任何操作,因此打印当前行的默认操作将发生。

' file2 file1

在此处提及名为file2和file1的输入。

尝试以下:

  1. 将文件2读入数组(假设文件已排序数据时间戳,如果不排序阵列)
  2. 读取文件1(如果需要,请按时间戳进行预选)按行行;为了每行,在数组上进行二进制搜索以找到掉落的行在此间隔中,将发现的行与文件1
  3. 合并

最新更新