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 file
2番目のものをコンパイル前に必要なファイル名に./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";
}
}
}