awkでCSVデータを操作する

awkでCSVデータを操作する

CSVファイルから個々のデータを取得し、grepまたはawkコマンドで変数として使用する方法を見つけようとしています。どちらも適切に見えますが、これを適切に実行するように指示する方法がわかりません。

たとえば、次のようにTSV形式のデータセットがあります。

ID    Name    Eye Color 

1     Bill    Blue 
2     Sam     Blue 
3     Fred    Brown 
4     Joe     Brown 
5     Ted     Blue 
6     Bob     Brown

これは実際のデータセットではありませんが、同じように動作します。これは完全なタンパク質結合データベースです。 TSVは300MBで、何百万ものエントリと数十の列が含まれているため、実際の内容を明確に含めることはできません。

青い目を持つ個人の行を含むファイルを作成したかったので、「ID」列で構成されたCSVファイルを作成しました。この場合、次のようになります。

1、2、5

「ID」を含むこのCSVは、「Grep」コマンドを使用してキーワードを検索することによって生成されました。

私は最終的に次のTSVファイルが欲しいです。 1 Bill Blue 2 Sam Blue 5 Ted Blue

しかし、どうすればいいのかわかりません。 awkまたはgrepを使用して各項目に対して個別に生成し、ID番号を条件として含めることができますが、私が使用するCSVには1200個の項目があるので、このプロセスを自動化したいと思います。

以下のコードは単一の項目に対して望ましい結果を生成しますが、ID番号を使用して検索を自動化したいと思います。

BindindDB_All.tsvは私のソースファイルで、何百万ものエントリがあります。これにより、「new.tsv」というTSVが生成され、ID(列1)が66106のBininddDB_All.tsvファイルの完全な行が含まれます。

awk '$1 == 66106' BindingDB_All.tsv >> new.tsv

私はこのようなことをしたい:

awk '$1 == ID.csv' BindingDB_All.tsv >> new.csv

各IDを読み取り、行をnew.csvに印刷してから、次のIDを読み取り、同じことを行います。

CSVファイルには、それぞれ一意のIDを持つ数百万のクエリと比較できる1,200のクエリが含まれています。各行の他の変数でIDを見つけるため、列1のみを検索する必要があります。

要約すると、行の列1を見て、CSVファイルの最初の数字と比較して一致することを確認する必要があります。一致するものがない場合は、列1の次の行を確認し、一致するものが見つかるまで確認を続ける必要があります。列1がCSVの最初のデータ要素と一致する行を見つけたら、その行を出力したいと思います。次に、1200行すべてが見つかるまでCSVの2番目の項目について繰り返したいと思います。

どんなアイデアがありますか?これはループの問題のように聞こえますが、どのように機能させるのかわかりません。

編集する:

人々はまだ助けを求めているようですので、投稿された質問に答えてみましょう。

以下は、検索パラメータとして使用されるID番号を含む実際のデータの最初の6項目です。

66106     
66107    
66108    
66109     
66110    
50127715    

列名もなく、他のデータもありません。異なるファイル(TSV)から個別に検索したい値です。 TSVサイズに関しても私も間違っていました。 300MB圧縮された4GB TSVがあります。ファイルには、私のプログラムで見られるものよりも多くの項目が含まれています。以下は、数百万の項目のうちの単一の項目の例です。これらすべてのデータを一度に抽出する必要があるため、整理することはできません。

50127715 CCCC(CCC)c1nc2N3[C@H]4CCC[C@H]4N=C3N(C)C(=O)c2[nH]1 InChI=1S/C18H27N5O/c1-4-7-11(8-5 -2)15-20-14-16(21-15)23-13-10-6-9-12(13)19-18(23)22(3)17(14)24/h11-13H,4 -10H2,1-3H3,(H,20,21)/t12-,13+/m1/s1 CSRSQFSFDXYRFV-OLZOCXBDSA-N 50073697 5-メチル-2-(1-プロピルブチル)-(6aR,9aS )-3 ,4,5,8-テトラヒドロシクロペンタ[4,5]イミダゾ[2,1-b]プリン-4-オン::CHEMBL280307 ホスホジエステラーゼ 1 Bos taurus 60 ChEMBL 10.1016/s0960-894x (98 )00681-7 9990447 Ho、GD Silverman、L Bercovici、A Puchalski、C Tulshian、D Xia、Y Czarniecki、M Green、M Cleven、R Zhang、H Fawzi、Schering-Plough研究所 http://www.bind/chemsearch/marvin/MolStructure.jsp?monomerid=50073697 http://www.binddb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=pol&polymerid=49000914&target=phosphodiesterase+1&column=ki&startPg=0&Increment=50&submit=Search http://www.bounddb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=r21&monomerid=50073697&enzyme=phosphodiesterase+1&column=ki&startPg=0&Increment=50&submit=Search 44272162 103967010 CHEMBL280307 ZINC28221715 1 LAY PEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVHT QTRSDVAILY NDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTM SLILHAAD ISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDKPT SLASVDLKSFKNSLVDIIQ QNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHSカルシウム/カルモジュリン依存性3',5'-環状ヌクレオチドホスホジエステラーゼ1A P141 00 Q08E30,Q28063

このボックスからTSVにどのように読み込むのかわかりませんが、50127715は最初の列であるID列です。興味のあるID番号を含む最初のCSVファイルで、一度に1つのID番号を指定して、最初の列で大きなTSVを検索したいと思います。数字が最初の列に含まれている場合は、その行をファイルに書き込み、次のIDを検索したいと思います。すべての結果を1つのファイルに保存したいと思います。

ここまで来るためにとられたすべての段階でこれを行うより簡単な方法があると確信していますが、それをより明確にする方法はわかりません。列1の大きなTSVで「66106」を検索し、その行を見つけたら、行全体をファイルに書き込むようにしたいと思います。次に「66107」を検索して検索し、同じファイルに追加します。これにより、何百万ものものではなく、1,200個のエントリを含むCSVファイルまたはTSVファイルがあります。

ベストアンサー1

$ awk -F'\t' '(NR==1) || ($3=="Blue")' file
ID      Name    Eye Color
1       Bill    Blue
2       Sam     Blue
5       Ted     Blue

しかし、実際に望むのは、各IDに対して新しいファイルを作成するようです。例のようにIDが一意であると仮定すると、次のようになります。

awk -F'\t' '{ out="out_" $1 ".txt"; print > out; close(out) }' BindingDB_All.tsv

または、各出力ファイルにヘッダーを含めたい場合:

awk -F'\t' '
    NR==1 { hdr=$0; next }
    { out="out_" $1 ".txt"; print hdr ORS $0 > out; close(out) }
' BindingDB_All.tsv

おすすめ記事