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は300 MBで、数百万のエントリと数十の列があるため、きれいにできません。本物を含めます。

青い目をした個人の行を含むファイルを作成したいので、" ID "列。この場合は次のようになります。

1、2、5

このCSVには" ID "は、" Grep "コマンドでキーワードを検索します。

最終的には次のようなTSVファイルが必要です:1ビルブルー2サムブルー5テッドブルー

しかし、私には見えません把握するため どうやるか。 awkまたはgrepを使用し、ID番号を基準として含めて、エントリごとに個別に作成できますが、使用しているCSVには1200のエントリがあるため、このプロセスを自動化します。

以下のコードはコードです。これにより、1つのエントリに対して目的の結果が生成されますが、ID番号を使用して自動的に検索したいと思います。

BindindDB_All.tsvは、数百万のエントリを持つソースファイルです。これにより、次のTSVが生成されます。 " new.tsv "であり、BindindDB_All.tsvファイルの行全体が含まれています。ID(列1)は66106です。

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

次のようなことをしたい:

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

各IDについて、その行をnew.csvに出力してから、次のIDを読み取って同じ操作を行います。

CSVファイルには1200の検索語が含まれており、それぞれが一意のIDを持つ数百万の可能性と比較されます。I他のvariabl内でIDが見つかるため、列1のみを検索する必要があります。

要約すると、行の列1を調べて、CSVファイルの最初の番号と比較し、一致するかどうかを確認する必要があります。一致しない場合は、列1の次の行をチェックする必要があり、一致するものが見つかるまで続きます。列1がCSVの最初のデータポイントと一致する行が見つかったら、その行を出力します。次に、1200行すべてが見つかるまで、CSVの2番目のエントリに対して繰り返します。

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

編集:

人々はまだ喜んで助けてくれるようですので、質問に答えてみましょう

これが私の実際のデータの最初の6つのエントリで、検索パラメータとして使用されるID番号が含まれています。

66106 66107 66108 66109 66110 50127715 

列名やその他のデータはありません。これらは、別のファイルであるTSVで個別に検索したい値です。TSVのサイズについても誤解しています。4GBのTSVがあります。 300 MB。このファイルには、どのプログラムでも表示できるよりも多くのエントリが含まれています。以下は、数百万のうちの1つのエントリの例です。このデータをすべて一度にプルする必要があるため、トリミングする必要はありません。オプション。

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 CSRSQF SFDXYRFV-OLZOCXBDSA-N 50073697 5-メチル-2-(1-プロピルブチル)-(6aR、9aS)-3,4,5,8-テトラヒドロシクロペンタ[4,5]イミダゾ[2,1-b]プリン-4- one :: CHEMBL280307ホスホジエステラーゼ1Bos taurus 60 ChEMBL10。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、A Schering-Plough Research Institute http://www.bindingdb.org/bind/chemsearch/marvin/MolStructure.jsp?monomerid=50073697 http://www.bindingdb.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.bindingdb.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 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRFRSIVHVVQAGIFVERMYRKSYHMVGLAYPEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAADISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHSカルシウム/カルモジュリン依存性3″ 、5″ -環状ヌクレオチドホスオジエステラーゼ1APDE1A_BOVIN P14100 Q08E30、Q28063

このボックス内でこれをTSVとして読み取る方法がわかりませんが、50127715が最初の列であるID列です。関心のあるID番号を含む最初のCSVファイルで、最初の列内で一度に1つのID番号で大きなTSVを検索したいと思います。番号が最初の列に含まれている場合は、その行をファイルに書き込んでから、次のIDを検索します。すべての結果を1つのファイルにまとめたいのです。

「ここにたどり着くまでのすべてのステップで、これを行う簡単な方法があると確信しています」が、どうすればよいかはっきりとわかりません。これはより明確です。大きなTSVで列1内の" 66106 "を検索し、行全体を書き込む行が見つかったら検索します。ファイル。次に、" 66107 "を検索し、見つかったら、同じファイルに追加します。このようにして、数百万ではなく1200エントリの単一のファイル(CSVまたはTSVにすることができます)を作成します。

コメント

  • 解析するだけではどうでしょうか。 TSVを直接? awk -F '\t'は、入力フィールドをタブで区切ります。実際、デフォルトでは、awkは隣接する空白でフィールドを区切ります。したがって、すべての青い目の人を取得する(そしてヘッダーを保持する)には、awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'が必要です。

test.tsv "、上記と同じ入力ですが、異常な出力が生成されました。すべての目の色を"青"に置き換えただけで、他のすべては同じままでした。

  • $3 = "Blue"$3 == "Blue"である必要があります。前者は課題であり、後者は比較です。
  • これはCSVですか、それともTSVですか?
  • 要件に関する情報を一度にブレッドクラムで提供することはできません'優れたソリューションを得るための優れたアプローチ。質問を編集して、あなたがやろうとしていることのより真に代表的な例を提供してください'。 TSVファイル、CSVファイル、および入力として期待される出力ファイルを含めます。すべてのユースケースをカバーしていることを確認してください。すべての一致が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 

    コメント

    • わかりやすくするために編集しましたが、実際にはそれらを含むファイルを1つだけ必要です。膨大なデータの性質上、デモンストレーション用にサンプルセットを作成しようとしましたが、'プログラミングが初めてなので、' '必要なものを適切に表現しているかどうかわからない。

    回答

    これをfuで見つけるかもしれない人のためにチュール、私には解決策があります。最初に行ったのは、次を使用してTSVをCSVに変換することでした。

    sed "s/\t/,/g" filename_with_tabs > filename_with_commas.csv 

    次に、探していたファイルコードを検索するのは次のとおりです。

    awk -F, "FNR==NR {h[$1] = $0; next} {print $0,h[$1]}" file1 file2 > new_file.csv 

    これにより、最初の列で別のCSVに含まれるテキストが検索されます。この場合、" file1 "が検索するファイルであり、" file2 "には、検索する文字列が含まれています。これらのファイルは両方ともCSV形式です。

    これにより、file2に含まれるIDの1つと一致する列1に特定のIDを持つfile1内のすべての行を含む個別のCSVファイルが作成されました。

    お役に立てば幸いです。 いつか誰かが、これが何週間も私の脳を壊してしまったからです。 私は自分で解決策を見つけることすらできませんでした。上司がそれを見せなければなりませんでした。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です