0

データベース ソフトウェアに煩わされることなく、テーブルに対して簡単なデータベース操作を実行したいと考えています。たとえば、GitHub の「filo」パッケージを使用して、「groupby」機能に似た操作を行うことができます。単純な「結合」機能を実現するために似たようなものがあるのだろうか?それとも Python や Bash でできますか? 具体的には、次のようなテーブルがあります。

Col5a2  NM_007737   chr1    -   45447828    45447829
Slc40a1 NM_016917   chr1    -   45870140    45870141
Gm3852  NM_001177356    chr1    -   45956809    45956810
Slc39a10    NM_172653   chr1    -   46798055    46798056
Obfc2a  NM_028696   chr1    -   51422944    51422945
Myo1b   NM_001161817,NM_010863  chr1    -   51860519    51860520
.
.
.

そして、私はリストを持っています

Slc40a1
Myo1b
Col5a2
Obfc2a
.
.
.

テーブルからリスト内のアイテムを取得したいので、次のようになります。

Slc39a10    NM_172653   chr1    -   46798055    46798056
Myo1b   NM_001161817,NM_010863  chr1    -   51860519    51860520
Col5a2  NM_007737   chr1    -   45447828    45447829
Obfc2a  NM_028696   chr1    -   51422944    51422945
.
.
.
4

5 に答える 5

3

join(1)これは、2 つの標準 UNIX ツールとsort(1)次のツールを使用して実現できます。

$ join <(sort table) <(sort list)

Col5a2 NM_007737 chr1 - 45447828 45447829
Myo1b NM_001161817,NM_010863 chr1 - 51860519 51860520
Obfc2a NM_028696 chr1 - 51422944 51422945
Slc40a1 NM_016917 chr1 - 45870140 45870141

への呼び出しsortが必要な理由は ( j​​oin の man ページから):

重要: FILE1 と FILE2 は結合フィールドでソートする必要があります。たとえば、'join' にオプションがない場合は、'sort -k 1b,1' を使用します。比較は、'LC_COLLATE' で指定された規則に従うことに注意してください。入力がソートされておらず、一部の行を結合できない場合は、警告メッセージが表示されます。

更新:この回答に触発されたソリューション、秩序を保つ:

$ join -1 2 <(cat -n list | sort -k2,2) <(sort table) | sort -nk2,2 | cut -d\  -f1,3-
于 2012-12-04T23:10:21.143 に答える
3

を使用する 1 つの方法を次に示しawkます。

awk 'FNR==NR { a[$1]=$0; next } $1 in a { print a[$1] }' table list

またはフォーマット付き:

awk 'FNR==NR { a[$1]=$0; next } $1 in a { print a[$1] }' table list | column -t

結果:

Slc40a1  NM_016917               chr1  -  45870140  45870141
Myo1b    NM_001161817,NM_010863  chr1  -  51860519  51860520
Col5a2   NM_007737               chr1  -  45447828  45447829
Obfc2a   NM_028696               chr1  -  51422944  51422945

説明:

'FNR==NR { ... }' は、引数リストの最初のファイルに対してのみ真となる条件です。

したがって、「table」というファイルの各行について、最初の列 ($1) が配列 (「a」と呼ばれる) に追加され、これに行全体 ($0) の値が割り当てられます。「next」は、「table」ファイル内のすべての行が処理されるまで、コードの残りの部分にスキップして入力の次の行にジャンプします。

'$1​​ in a' は別の条件です。

これは、「リスト」ファイルの列 1 が配列内のキーであるかどうかを尋ねています。そうであれば、配列に格納したばかりの列 1 の値 (a[$1]) を出力します。

于 2012-12-04T23:09:22.863 に答える
1

テーブルの最初の列で非常に単純なルックアップのみを行っている場合は、dictおそらく Python で十分なデータ構造です。

次のようにビルドします。

table = {}
with open(table_file) as f:
    for line in f:
        row = line.split()
        table[row[0]] = row

次に、リスト内包表記を使用して、この辞書に対して「結合」を実行できます。

results = [table[key] for key in keys_list]

または、2 番目のリストもデータ ファイルである場合は、代わりに次のようにすることができます。

with open(second_file) as f:
    results = [table[line.strip] for line in f]
于 2012-12-04T23:00:23.687 に答える
0

データベースのように機能するパンダを使用して、「選択」してピボットできます。これは動作する例です:

import pandas as pd
data = pd.DataFrame({ 
        'Col5a2'  : ['NM_007737',    '-',         'chr1', 45447828, 45447829],
        'Slc40a1' : ['NM_016917',    '-',         'chr1', 45870140, 45870141],
        'Gm3852'  : ['NM_001177356', '-',         'chr1', 45956809, 45956810],
        'Slc39a10': ['NM_172653',    '-',         'chr1', 46798055, 46798056],
        'Obfc2a'  : ['NM_028696',    '-',         'chr1', 51422944, 51422945],
        'Myo1b'   : ['NM_001161817', 'NM_010863', 'chr1', 51860519, 51860520],
    })
data.get(['Slc40a1', 'Myo1b', 'Col5a2', 'Obfc2a'])

# Output:

     Slc40a1         Myo1b     Col5a2     Obfc2a
0  NM_016917  NM_001161817  NM_007737  NM_028696
1          -     NM_010863          -          -
2       chr1          chr1       chr1       chr1
3   45870140      51860519   45447828   51422944
4   45870141      51860520   45447829   51422945
于 2012-12-04T23:21:58.560 に答える
0
import numpy as np
data = []
with open("file1.txt") as f:  #the data file
   for row in f:
      data.append(row.split())
with open("file2.txt") as f:  #the keys file
   keys = map(str.strip,f.readlines())
np_data = np.array(data,np.str)
mask = np.in1d(np_data[:,0],keys)
print np_data[mask]

私が本当にデータベースを使いたくない場合は、それがどのように行うか

于 2012-12-04T23:00:00.350 に答える