文件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? 但他们总是专注于比赛。
答案 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{
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
内置的关键字next
,这意味着将所有后续语句保留下来,以便awk
的光标移动到语句的开头。
($NF>=MIN && $NF<=MAX)
现在我们需要检查一个条件(仅在第一个文件名为file2被完全读取时执行),如上面next
语句所述,这将不允许它执行这个条件。如果$NF
的值大于或等于变量MIN
的值且小于或等于MAX
的值,请检查此处,然后打印当前行,尽管没有写入任何内容在这里打印awk
适用于条件/操作,因此如果条件为TRUE
,则应放置某些操作。此处未描述任何操作,因此将打印当前行的默认操作。
' file2 file1
在这里提到名为file2和file1的Input_files。
答案 1 :(得分:0)
试试这个: