2つのファイル(列が2つのファイルと列が3つのファイル)のデータを比較します。

2つのファイル(列が2つのファイルと列が3つのファイル)のデータを比較します。

2つのファイルがあります。

ファイル1:

Chromosome   Position
Chr1    5242097
Chr1    4876397
Chr1    9474943
Chr1    8494518
Chr1    39872693
Chr1    9445153
Chr1    23044399
Chr1    8018859
Chr1    9474943
Chr1    42380010
Chr1    9474943
Chr1    22677151
Chr1    23044399
Chr1    42380010

ファイル2:

Chr1    1   0
Chr1    2   0
Chr1    3   0
Chr1    4   0
Chr1    5   0
Chr1    6   0
Chr1    7   0
Chr1    8   0
Chr1    9   0
Chr1    10  0
Chr1    11  0
Chr1    12  0
Chr1    13  0
Chr1    14  0
Chr1    15  0
Chr1    16  0
Chr1    17  0
Chr1    18  0
Chr1    19  0
Chr1    20  0
Chr1    21  0
Chr1    22  0
Chr1    23  0
Chr1    24  0
Chr1    25  0
Chr1    26  0
Chr1    27  0
Chr1    28  0
Chr1    29  0
Chr1    30  0
Chr1    31  0
Chr1    32  0
Chr1    33  0
Chr1    34  0
Chr1    35  0
Chr1    36  0
Chr1    37  0
Chr1    38  0
Chr1    39  0
Chr1    40  0
Chr1    41  0
Chr1    42  0
Chr1    43  0
Chr1    44  0
Chr1    45  0
Chr1    46  0
Chr1    47  0
Chr1    48  0
Chr1    49  0
Chr1    50  0

File2は容量がかなり大きく、全体の内容を示していません。この数字は6桁以上に増えることがあります。

file1の2番目の列と一致する場合は、file2から3番目の列を取得したいと思います。

私はPerlプログラムを書いたが、非常に遅かった。私はこれを行うための簡単な方法を探しています。 Grepも非常に遅いです。

答え1

私は書くことができます

awk '
    # store column 2 from the first file
    NR == FNR {pos[$2] = 1; next}

    # from the second file, print the 3rd field if it occurred in file1
    $3 in pos {print $3}
' file1 file2

答え2

ファイル1にcol2のみを保持

awk '{print $2}' file1 > file1_col2

次に col3 を file2 に保持します。

awk '{print $3}'  file2> file2_col3

次に、file2_col3 に表示される file1_col2 行を検索します。

grep -f file1_col2 file2_col3

答え3

遅い場合はC ++が役に立ちます。真剣に、C ++は速いものを書くのにも使うことができます=)。 file.ccに保存してコンパイルし、ファイルディレクトリから実行します。g++ file.cc -O2 -o file2番目のものをコンパイル前に必要なファイル名に./file置き換えます。firstfilename

スピードの面ではC++を倒せません =)

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
   ifstream f1("firstfilename"), f2("secondfilename");
   string s;
   int i1, i2, line=0;
   while (!f1.eof()) {
      line++;
      if (f2.eof()) {
         cout << "Length different!" << "\n";
      }
      f1>>s>>i1;
      f2>>s>>i2>>i2;
      if (i1 != i2) {
         cout << "Not matching line " << line << " " << i1 << "<>" << i2 << "\n";
      }
   }
}

答え4

使用join、含むsortデータが適切なフィールドにソートされていない場合。

join -1 2 -2 3 -o 2.3 <(sort -k2,2 file1) <(sort -k3,3 file2)

必要でない場合sort:

join -1 2 -2 3 -o 2.3 file1 file2

これはGNUユーティリティを使用して行われます。他のバリエーションでは、どのUnixを使用しているかを知る必要があります。上記のバージョンはsortBashプロセスの交換を示しており、他のいくつかのシェルでも動作します。

結合フィールドも出力フィールドなので、-o 2.3単純化できます-o 0

関連情報