2016-07-08 1 views
1

私はプログラミングの世界の新人です。私が簡単で分かりやすい質問をしたら、許してください。私は本当にたくさんの助けが必要です。2つの異なるファイルを比較し、重複するデータを抽出するにはどうすればよいですか?

私は現在、2組のデータを持っています。

最初の1本(FILE1それを呼び出す)のようになります。

GeneName 
TAF13 
ZC3H6 
RAC3 
MED16 
FAT3 
SCRG1 
GRM3 
DHX16 
LRRN4CL 
STMN4 
PCDHGA11 
RPLP1 
WASF1 
KATNAL1 
FTL1 
D8ERTD738E 

秒1は、このようになります( "FILE2" それを呼び出す):

GeneName Chr Start End SumOfMerge 67_1 67_2 67_3 68_1 68_2 68_3 69_1 69_2 69_3 70_1 70_2 70_3 71_1 71_2 71_3 72_1 72_2 72_3 73_1 73_2 73_3  
LOC100288069 chr1 713126 714875 13 NA nPk1 nPk1 NA nPk1 nPk1 NA NA nPk1 NA nPk2 nPk1 NA nPk1 nPk1 NA nPk1 nPk1 NA nPk1 nPk1  
FAM87B chr1 752176 752900 20 nPk2 nPk3 nPk2 nPk2 nPk3 nPk3 nPk2 nPk3 nPk3 nPk2 nPk4 NA nPk3 nPk3 nPk3 nPk3 nPk3 nPk2 nPk2 nPk3 nPk3  
LINC00115 chr1 761026 763300 20 nPk7 nPk6 nPk3 nPk7 nPk5 nPk4 nPk7 nPk8 nPk5 NA nPk5 nPk3 nPk8 nPk6 nPk4 nPk7 nPk7 nPk3 nPk8 nPk7 nPk4  
SAMD11 chr1 858401 862175 20 nPk16 NA nPk10 nPk16 nPk13 nPk13|nPk14 nPk16 nPk16 nPk13 nPk14 nPk13 NA nPk18 nPk13 nPk11|nPk12 nPk17 NA nPk12 nPk17 nPk16 nPk11 
KLHL17|NOC2L chr1 892751 897375 21 nPk23 nPk14 nPk15 nPk24|nPk25 NA nPk18 nPk25 nPk20 nPk18 nPk24 nPk18 nPk10 nPk27|nPk28 nPk17 NA nPk25 nPk18 nPk18 nPk24 nPk20 nPk16 
HES4 chr1 934201 937725 14 nPk30 nPk19 nPk19 NA nPk24 nPk22 nPk33 nPk25 nPk22 NA NA NA NA NA nPk23 nPk32 nPk23 nPk22 NA nPk25 nPk20 
ISG15 chr1 948076 948750 7 nPk32 NA NA nPk33 NA NA nPk36 NA NA nPk35 NA NA nPk37 NA NA nPk34 NA NA nPk36 NA NA 
AGRN chr1 954376 954875 21 nPk34 nPk22 nPk21 nPk36 nPk27 nPk24 nPk38 nPk28 nPk24 nPk37 nPk24 nPk16 nPk39 nPk24 nPk25 nPk36 nPk26 nPk24 nPk38 nPk28 nPk22 
AGRN chr1 954951 955275 11 NA NA nPk22 NA nPk28 nPk25 NA nPk29 nPk25 NA nPk25 nPk17 NA NA nPk26 NA nPk27 nPk25 NA NA nPk23 
C1orf159 chr1 1051051 1052500 21 nPk53 nPk38 nPk37 nPk56 nPk42 nPk39 nPk60 nPk42 nPk41 nPk54 nPk38 nPk25 nPk55 nPk40 nPk40 nPk57 nPk45 nPk38 nPk55 nPk50 nPk38 
LINC01342 chr1 1070301 1073175 2 NA NA NA NA NA NA NA NA NA NA nPk40 nPk28 NA NA NA NA NA NA NA NA NA 
TTLL10 chr1 1108776 1109450 1 NA NA NA NA NA NA NA NA NA nPk65 Na NA NA NA NA NA NA NA NA NA NA 
TNFRSF4 chr1 1150276 1150750 2 NA NA NA NA NA NA NA NA NA nPk72 NA NA nPk72 NA NA NA NA NA NA NA NA 
SDF4 chr1 1165926 1167475 4 NA NA NA NA NA nPk48 NA NA NA NA NA NA NA NA nPk50 NA NA nPk45 NA NA nPk46 

秒場合はご容赦くださいデータが実際に乱雑に出てきました。実際には、それぞれ26個の列がタブスペースで区切られたデータです。

私の目的は、file1とfile2を最初の列 "GeneName"で比較し、file2の行を新しいファイルfile3に抽出することです。

file3は、file1と同じGeneNameを持つ行だけがfile2のように見えるはずです。

現在、私はcommjoingrep -fで試してみましたが、私が望む解決法はありませんでした。私はgrepが仕事をするのに十分かもしれないと思いますが、正しいオプションはわかりません。この問題の解決策が他にもある場合は、私と共有してください。当時ありがとう!

+0

これはPythonではかなり簡単です。あなたはそれに関して何か経験がありますか、それとも容認できるでしょうか? – Alden

+0

@Alden私はそれに精通していませんが、私はコードを理解するために全力を尽くすことができます。とにかくありがとう! :) –

答えて

1

小さなPythonコードについてはどう思いますか?その後、

#!/usr/bin/python 

import sys, re 

lookup = {} 
for line in open(sys.argv[1]).readlines(): 
    lookup[line.rstrip()] = True 

for line in open(sys.argv[2]).readlines(): 
    s = re.split('[\t ]+', line) 
    if len(s) > 0 and s[0] in lookup: 
    print(line.rstrip()) 

ファイルがpy.pyとして保存されている場合は、この時点で

chmod 755 py.py 
./py.py file1 file2 > file3 

あなたは大文字と小文字を区別できないために、ファイルを少し微調整したい場合がありますか?ルックアップキーとs [0]に.lower()を追加します。

2

をGrep +のbashは:

grep -f <(tail -n +2 file1 | sed 's/^/^/g') file2 > file3 

これはGeneName列を削除(tail -n +2を使用して最初の行をスキップ - 第二行から印刷を開始)し、それぞれの先頭に^(行頭のために正規表現)を追加このようなリストは、grep -fが行にマッチしてfile3に書き込むのに適しています。

これは、出力にヘッダー(GeneName)行を必要としないことを前提としています。

+1

返事ありがとうございます。コードを試しましたが、結果のファイルは完全に空白です。データが重複していることを確認したので、少なくとも数行は必要です。また、GeneNameを^に置き換える目的についてもう少し説明できますか?ありがとうございました! –

+0

@DLee 'grep -v'は、一致しないすべての行を出力するためのものです。末尾に –

+0

を置き換えました。@DLee実際の例がありますか?私は私の例でそれをテストし、それが動作するので、入力にいくつかの問題があるかもしれません。 –

関連する問題