2016-12-21 21 views
0

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

_where timestamp介於文件2_上的TIMESTAMP時間間隔是什麼意思? –

+0

我在這裏要做的是獲取file2中的TIMESTAMP範圍和文件1合併的所有元組,但條件是如果我有一個文件1中有一個TIMESTAMP <=文件2的TIMESTAMP的元組I將離開file3。如果file1的下一個元組>> = file2的第一個TIMESTAMP,並且<下一個,則它將被合併並寫入文件3,依此類推。 – gabriel32

回答

0

嘗試這種情況:

  1. 讀取文件2到一個數組(假定該文件已通過 時間戳排序的數據,如果陣列未排序)由時間戳如果
  2. 讀取的文件1(預排序它需要)逐行;對於 每一行,做陣列上的二進制搜索發現,在區間落在 行,從文件合併與行發現1號線
3

能否請您嘗試以下,讓我知道,如果這有助於您。

​​

您可以將上面的輸出轉換成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的值大於$NF(這是最後一個字段中awk,其中$指該字段的值和NF指字段的數量)。如果此條件爲TRUE,則將完成通配符?之後的操作,這會將MIN的值更改爲$NF。如果該條件爲NOT TRUE,則執行:後的動作/條件。因此,這裏又有一個條件,檢查MIN是否爲NULL,然後保持其值爲$NF,否則保持MIN的值。

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

創建一個名爲MAX變量,並添加一個條件,以檢查是否MAX的值大於$NF更大的價值,如果這是TRUE動作之後再?,這是保持最大的價值,因爲它是,將被執行。如果FALSE則將執行:之後的操作,即將其值更改爲$NF

next} 

使用awk「建於關鍵字next下面就意味着把所有未來的語句進一步所以awk的光標移動到報表的開始。

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

現在,我們需要檢查的條件(這將當被完全讀取名爲file2的第一個文件只執行),上述next聲明所描述的,這不會允許它執行這個條件。如果$NF的值大於或等於變量MIN的值並小於或等於MAX的值,請在此處檢查,然後打印當前行,但此處沒有任何寫入要打印的內容。 awk適用於條件/動作,因此如果條件爲TRUE,則應該放置某些操作。這裏沒有描述任何操作,因此打印當前行的默認操作將會發生。

' file2 file1 

在這裏提到名爲file2和file1的Input_files。

+0

歡迎來到堆棧溢出!爲了把它變成一個很好的答案,請解釋它的做法,以便人們可以瞭解正在發生的事情,而不僅僅是一種複製/粘貼解決方案。 – iblamefish

+0

Hello iblamefish, 謝謝。沒有先生,這不是一個複製/粘貼的答案,我試圖在這裏說明它說的是少的字符只允許我試着現在發佈一個答案,道歉以前沒有發佈它。 – RavinderSingh13

+0

非常感謝您的回答,但不幸的是,它沒有解決我需要的問題。 – gabriel32