2016-06-21 5 views
0

私はUnixに2つの非常に大きなファイルを持っています。Unixのフィールドで2つのファイルを比較します

例:

ファイル1: ABC | DEF | GHK | IJK | LMN .... ...

File2の: ABC | DEF | GHK | IJK | 123 。 .. ...

私の仕事は、2つの大きなファイルを比較して、異なる列と行を探し出すことです。たとえば、出力は次のようになります。 列なし行なしファイル1ワードFile2ワード。

例:

5 1 LMN 123個の

ファイルが本当に大きいです。私はawkがUnixでのファイル解析を行う最も速い方法だと聞いています。出力はあまりにも長く待つことができないので。

これはawkを使用して行うことができますか?

+0

はい、2つのファイルを同時に読むのは難しいですが、1つのファイルからすべての入力を保存してからそれを使用するのは、awkスクリプトの通常の操作モードです。あなたは何を試しましたか?どこに問題がありましたか? PerlやPythonを使用することができれば、1つのファイル全体をメモリにスラッピングするのを避ける方が簡単です。 –

+0

Perlを使用しても、少なくとも1つのファイルをメモリに残しておく必要がありますか?そして、そのデータ構造を使用して2番目のファイルを比較します。 –

+0

いいえ。 Perlを使用すると、ファイル1から1行、ファイル2から1行を読み込み、それらの行を比較して差分を出力します。リンスとリピート。 –

答えて

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 

私は順序を変更し、それが最初にフィールド番号を行番号を印刷するには、私に多くの意味がある、しかし、あなたは簡単にそれを変更することができます...

ペーストが一致したら2つのファイルからの行は、前半(最初のファイル)のフィールドに行き、後半(2番目のファイル)と比較して差異を出力します。 awkには、すべてのレコード(行)に対する暗黙のループがあります。私は大きなファイルでこれをテストしていませんが、awk部分については(レコードで記録する)問題ではありません。 pasteがどれほど熱心であるか分かりませんが、私はそれが点滅することは疑いません。

+0

私はあまりにawkに堪能ではありません。あなたはこれがどのように行われたのか教えていただけますか?非常に大きなファイルの場合でもプロセスは効率的に働くでしょう –

+1

@SubhayanBhattacharya: 'paste'コマンドはfile1の1行目をfile2の1行目と同じ行に置きます。 '|'によって( '-d '|''のために)。 'awk'コマンドはフィールドを操作し、必要に応じて比較して印刷します。 'file1'に5つのフィールドがある場合、入力行に10があります。 'w '= 5; '$ 1 'と' $ 6'、 '$ 2'と' $ 7'などを比較してdiffを報告します。 –

関連する問題