Utilisation de données CSV avec awk

Jessaie de trouver un moyen de prendre les données individuelles dun fichier CSV et de les utiliser comme variable dans un grep ou commande awk. Lun ou lautre semble approprié, mais je ne sais pas comment lui dire de le faire correctement.

Par exemple, jai un ensemble de données au format TSV qui ressemble à ceci:

ID Name Eye Color 1 Bill Blue 2 Sam Blue 3 Fred Brown 4 Joe Brown 5 Ted Blue 6 Bob Brown 

Ce nest pas le jeu de données réel, mais il se comporte de la même manière. Il sagit de la base de données complète de liaison de protéines, le TSV fait 300 Mo avec des millions dentrées et des dizaines de colonnes, donc je ne peux pas » t proprement inclure la chose réelle.

Je veux créer un fichier contenant les lignes avec des individus qui ont les yeux bleus, jai donc créé un fichier CSV qui est composé du " ID " colonne, qui dans ce cas ressemblerait à ceci:

1, 2, 5

Ce CSV contenant le " ID " a été généré à laide de " Grep " pour rechercher le terme clé.

Je veux finalement un fichier TSV qui ressemble à ceci: 1 Bill Blue 2 Sam Blue 5 Ted Blue

Mais je ne peux pas sembler se rendre compte comment faire. Je peux le créer individuellement pour chaque entrée en utilisant awk ou grep et en incluant le numéro didentification comme critère, cependant le CSV que jutilise a 1200 entrées donc je voudrais automatiser ce processus.

Ci-dessous le code qui produira le résultat souhaité pour une seule entrée, mais je souhaite utiliser les numéros didentification pour rechercher automatiquement.

Le BindindDB_All.tsv est mon fichier source, avec plusieurs millions dentrées. Cela produira un TSV appelé " new.tsv " et contient la ligne entière du fichier BindindDB_All.tsv où lID (dans la colonne 1) est égal à 66106.

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

Je voudrais faire quelque chose comme ceci:

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

où il serait lu chaque ID, imprimez la ligne vers new.csv, puis lisez lID suivant et faites de même.

Le fichier CSV contient 1200 termes de recherche, à comparer avec plusieurs millions de possibilités chacun avec un ID unique. I besoin de rechercher UNIQUEMENT la colonne 1, car il trouvera lID dans une autre variable es dans chaque ligne.

Pour résumer, jen ai besoin pour regarder dans la colonne 1 de la ligne, la comparer au premier numéro de mon fichier CSV et voir si cest une correspondance. Sil ne sagit pas dune correspondance, il doit vérifier la ligne suivante de la colonne 1, et ainsi de suite jusquà ce quil trouve la correspondance. Lorsquil trouve la ligne où la colonne 1 correspond au premier point de données CSV, je veux quil affiche la ligne. Ensuite, je veux quil se répète pour la deuxième entrée du CSV, jusquà ce quil ait trouvé les 1200 lignes.

Des idées? Cela ressemble à un problème de boucle, mais je ne sais pas non plus comment le faire fonctionner.

MODIFIER:

Puisque les gens semblent toujours prêts à vous aider, laissez-moi essayer de répondre aux questions qui ont été publiés.

Voici les 6 premières entrées de mes données réelles, contenant des numéros didentification qui seront utilisés comme paramètres de recherche.

66106 66107 66108 66109 66110 50127715 

Il ny a pas de noms de colonnes, pas dautres données. Ce sont des valeurs que je souhaite rechercher individuellement dans un fichier différent, un TSV. Jai également mal parlé concernant la taille du TSV, jai un TSV de 4 Go, qui se compresse en 300 Mo. Le fichier contient plus dentrées quaucun de mes programmes ne le permet dafficher. Ci-dessous, un exemple dune entrée unique sur plusieurs millions. JAI BESOIN que toutes ces données soient extraites en même temps, donc le rognage nest pas un option.

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-méthyl-2- (1-propylbutyl) – (6aR, 9aS) -3,4,5,8-tétrahydrocyclopenta [4,5] imidazo [2,1-b] purine-4- one :: CHEMBL280307 Phosphodiestérase 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, 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 calcium / calmoduline-dépendante 3″ , 5″ -nucléotide cyclique phosph odiesterase 1A PDE1A_BOVIN P14100 Q08E30, Q28063

Je ne suis pas sûr de savoir comment faire cela comme un TSV dans cette boîte, mais 50127715 est la première colonne, la colonne ID. Je souhaite que mon fichier CSV initial, contenant les numéros didentification dintérêt, recherche le grand numéro didentification TSV un à la fois dans la première colonne. Si le numéro est contenu dans la première colonne, je veux quil écrive cette ligne dans un fichier, puis recherche lID suivant. Je veux tous les résultats dans un seul fichier.

Je suis sûr que tout au long de toutes mes étapes pour y parvenir, il existe un moyen plus simple de le faire, mais je ne sais clairement pas comment faire ce plus clair. Je veux quil recherche le grand TSV pour " 66106 " dans la colonne 1, et quand il trouve la ligne pour écrire la ligne entière dans un fichier. Recherchez ensuite " 66107 " et une fois quil la trouvé, ajoutez-le au même fichier. De cette façon, jai un seul fichier, Peut être un CSV ou TSV, avec 1200 entrées au lieu de plusieurs millions.

Commentaires

  • Pourquoi ne pas simplement analyser le TSV directement? awk -F '\t' séparera les champs de saisie par onglets. Et en effet, par défaut, awk séparera les champs par des espaces conigus. Donc, pour obtenir toutes les personnes aux yeux bleus (et préserver len-tête), il vous suffit de awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'.
  • Jai essayé dexécuter cette commande sur un exemple de fichier appelé " test.tsv ", avec la même entrée que celle indiquée ci-dessus, mais il a produit une sortie inhabituelle. Il vient de remplacer toutes les couleurs des yeux par " Blue " tandis que tout le reste est resté le même.
  • $3 = "Blue" doit être $3 == "Blue". Le premier est une affectation, le second est une comparaison.
  • Sagit-il dun fichier CSV ou TSV?
  • La répartition des informations sur vos besoins un fil dAriane à la fois nest pas ' une bonne approche pour obtenir une bonne solution. Veuillez modifier votre question pour fournir un exemple plus représentatif de ce que vous ' essayez de faire. Incluez un fichier TSV, un fichier CSV et les fichiers de sortie attendus que vous attendez en tant quentrée. Assurez-vous de couvrir tous vos cas dutilisation, par exemple si toutes les correspondances correspondent à des valeurs dans une colonne ou à des correspondances différentes dans différentes colonnes, etc. Voir Comment demander .

Réponse

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

Cela ressemble à ce que vous essayez vraiment de faire, cependant, cest créer un nouveau fichier par ID qui, en supposant que les ID sont uniques comme dans votre exemple, serait:

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

ou si vous voulez que chaque fichier de sortie inclue len-tête:

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

Commentaires

  • Je lai modifié pour plus de clarté, mais je ne veux vraiment quun fichier contenant ceux-ci En raison de la nature énorme des données, jai juste essayé de créer un ensemble dexemples à des fins de démonstration, mais je ' suis nouveau dans la programmation, donc je ' je ne sais pas si ' exprime correctement ce dont jai besoin.

Réponse

Pour tous ceux qui peuvent trouver cela dans le fu ture, jai une solution. La première chose que jai faite a été de convertir le TSV en CSV en utilisant:

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

Ensuite, pour rechercher mon code de fichier que je recherchais, cest:

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

Ceci recherchera dans la première colonne le texte contenu dans un CSV séparé. Dans ce cas, " file1 " est le fichier à rechercher et " file2 " contient les chaînes à rechercher. Ces deux fichiers sont au format CSV.

Cela a produit un fichier CSV séparé contenant toutes les lignes dans file1 qui avaient un certain ID dans la colonne 1 qui correspond à lun des ID contenus dans file2.

Jespère que cela aide quelquun un jour, parce que cela a ébranlé mon cerveau pendant des semaines. Je nai même pas trouvé la solution moi-même, mon patron a dû me la montrer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *