0

金曜日の午後、私は別のファイルの内容に基づいて1つのファイルをフィルタリングするのに苦労しています。タブ区切りの値のリストを含む1つのファイルがあります。

1   H   3   0.3937180424
1   H   4   0.3594894329
1   H   5   0.3501040944
1   H   6   0.2699868938
1   H   7   0.3200876953
1   H   8   0.3047540533
1   H   9   0.3088543852
1   H   10  0.305982215
1   H   11  0.2798568174

およびタブ区切りの値を持つ別のファイル(例:

chr1    1   74440
chr1    2   90281
chr1    3   136529
chr1    4   484700
chr1    5   294898
chr1    6   284812
chr1    7   432322
chr1    8   458256
chr1    9   290078
chr1    10  366518
chr1    11  342903

2番目のファイルをフィルタリングして、最初のファイルの位置のみを含めるようにします。現在、2番目のファイルには余分な行があり、一部を削除する必要があります。位置情報は、結合された最初のファイルの1番目と3番目の列から取得されます。したがって、例の1行目の位置情報は13です。これは1番染色体の位置3を意味します。これは2番目のファイル(3行目)のchr13に対応します。ファイル2をファイル1でフィルタリングする簡単な方法を知っている人はいますか?ファイル2の「chr」文字列を削除すると、簡単になります。シェルまたはPython(その言語を学習する)で使用できる簡単なソリューションは本当に素晴らしいでしょう。これを解決して、分析で出力を使用する必要があります。

よろしくお願いします。

ルバル

4

3 に答える 3

1

bashシェルとして使用すると仮定すると、これは機能する可能性があります。file1.txtが大きい場合、パフォーマンスがどのようになるかわかりません。

grep -f <( awk '{print "chr"$1"\t"$3}' file1.txt ) file2.txt
于 2012-08-24T13:24:08.643 に答える
1

あなたはPythonを求めました:

#!/usr/bin/env python

F = {}

with open("f1") as fd:
    for line in fd:
        key="chr%s%s" % (line.split()[0], line.split()[2])
        F[key]=True

with open("f2") as fd:
    for line in fd:
        key="%s%s" % (line.split()[0], line.split()[1])

        if key in F:
            print line.strip()

出力:

chr1    3   136529
chr1    4   484700
chr1    5   294898
chr1    6   284812
chr1    7   432322
chr1    8   458256
chr1    9   290078
chr1    10  366518
chr1    11  342903
于 2012-08-24T13:44:08.770 に答える
1

awkだけで:

awk -F '\t' '
  FILENAME == ARGV[1] { pair["chr" $1 FS $3] = 1; next }
  ($1 FS $2) in pair
' file1 file2
于 2012-08-24T13:44:50.583 に答える