2016-06-21 154 views
0

我在Unix中有兩個非常大的文件,每個文件包含5列但是數百萬行。比較Unix中的兩個文件字段

例:

文件1: ABC | DEF | GHK | IJK | LMN .... ...

文件2: ABC | DEF | GHK | IJK | 123 。 .. ...

我的任務是比較兩個大文件,找出不同的列和行。例如,輸出爲: Column-no Row-no File1-word File2-word。

例:

5 1 LMN 123

的文件確實是很大。我聽說awk是在Unix中執行文件解析的最快方法。由於輸出不能等待太久。

這可以使用awk來完成嗎?

+0

是的,它可以用'awk'完成 - 雖然同時從兩個文件中讀取很難,但是保存所有來自一個文件的輸入,然後使用它,而讀取第二個文件是awk腳本的正常操作模式。你嘗試了什麼,你遇到了哪些問題?如果你可以使用Perl或Python,你會發現避免將整個文件拖入內存變得更容易。 –

+0

即使我使用Perl,我至少必須在內存中汲取一個文件嗎?然後使用該數據結構來比較第二個文件 –

+0

否;使用Perl,你需要讀取文件1中的一行和文件2中的一行,然後比較這些行,並打印差異;沖洗並重復。 –

回答

2

paste/awk解決方案

$ paste -d'|' file1 file2 | 
    awk -F'|' '{w=NF/2; 
       for(i=1;i<=w;i++) 
       if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w); 
       print ""}' 

1 5 lmn 123 

我的順序改變了,這讓我更有意義打印行數第一,然後場數,但是你可以很容易地改變它......

一旦粘貼比賽來自兩個文件的行遍歷前半部分(第一個文件)的字段並與後半部分(第二個文件)進行比較並打印差異。 awk對所有記錄(行)具有隱式循環。我沒有用大文件測試過這個,但是對於awk部分它沒有關係(按記錄記錄)。我不知道多麼渴望paste是,但我懷疑它會眨眼。

+0

我對awk不太熟練。你能解釋一下這是怎麼完成的嗎?即使在文件非常大的情況下,該過程也能有效工作 –

+1

@SubhayanBhattacharya:'paste'命令將file1的第1行的副本放在與file2的第1行相同的行上,由'|'(因爲'-d'|'')。 awk命令然後通過字段進行工作,在必要時進行比較和打印。如果'file1'中有5個字段,則輸入行中有10個字段; 'w' = 5;它比較'$ 1與'$ 6','$ 2'與'$ 7'等,報告差異。 –