文件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{
FNR
和 NR
是2个AWK的内置变量,它将让我们知道任何文件的行数,因此NR
变量的值将增加,直到最后一个文件读取为止。如我们所知,awk
可以一次读取多个文件,但是与NR
不同,FNR
的值将在每个正在读取的新文件的开头重置。我给出条件FNR==NR
,这意味着该条件仅在读取第一个文件时才是TRUE
。此外,我正在使用FNR>1
来确保不应读取文件2的第一行 - 因为它中有标题而不是时间安排。因此,当这两个都是TRUE
时,应进行下一个动作。
MIN=MIN>$NF?NF:(MIN?MIN:$NF);
创建一个名为 MIN
的变量,如果MIN
的值大于$NF
(awk
中的最后一个字段),则具有条件,其中$
是指该字段的值,而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的输入。
尝试以下:
- 将文件2读入数组(假设文件已排序数据时间戳,如果不排序阵列)
- 读取文件1(如果需要,请按时间戳进行预选)按行行;为了每行,在数组上进行二进制搜索以找到掉落的行在此间隔中,将发现的行与文件1 合并