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にすることができます)を作成します。
コメント
回答
$ 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ファイルが作成されました。
お役に立てば幸いです。 いつか誰かが、これが何週間も私の脳を壊してしまったからです。 私は自分で解決策を見つけることすらできませんでした。上司がそれを見せなければなりませんでした。
awk -F '\t'
は、入力フィールドをタブで区切ります。実際、デフォルトでは、awk
は隣接する空白でフィールドを区切ります。したがって、すべての青い目の人を取得する(そしてヘッダーを保持する)には、awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'
が必要です。test.tsv "、上記と同じ入力ですが、異常な出力が生成されました。すべての目の色を"青"に置き換えただけで、他のすべては同じままでした。
$3 = "Blue"
は$3 == "Blue"
である必要があります。前者は課題であり、後者は比較です。