Verwenden von CSV-Daten mit awk

Ich versuche, eine Möglichkeit zu finden, die einzelnen Daten aus einer CSV-Datei zu entnehmen und als Variable in einem grep oder zu verwenden awk Befehl. Beides scheint angemessen zu sein, aber ich bin mir nicht sicher, wie ich es anweisen soll, dies angemessen zu tun.

Ich habe beispielsweise einen Datensatz im TSV-Format, der folgendermaßen aussieht:

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

Dies ist nicht der eigentliche Datensatz, verhält sich aber genauso. Dies ist die gesamte Proteinbindungsdatenbank. Der TSV beträgt 300 MB mit Millionen von Einträgen und Dutzenden von Spalten, sodass ich nicht sauber sein kann Fügen Sie die reale Sache hinzu.

Ich möchte eine Datei mit den Zeilen mit Personen mit blauem Auge erstellen. Daher habe ich eine CSV-Datei erstellt, die aus der " ID " Spalte, die in diesem Fall folgendermaßen aussehen würde:

1, 2, 5

Diese CSV enthält die " ID " wurde mit dem " Grep " Befehl zum Suchen nach dem Schlüsselbegriff.

Ich möchte letztendlich eine TSV-Datei, die so aussieht: 1 Bill Blue 2 Sam Blue 5 Ted Blue

Aber ich kann nicht scheinen herausfinden wie es geht. Ich kann es für jeden Eintrag einzeln mit awk oder grep erstellen und die ID-Nummer als Kriterium angeben. Die von mir verwendete CSV enthält jedoch 1200 Einträge, sodass ich diesen Prozess automatisieren möchte.

Nachfolgend finden Sie den Code Das wird das gewünschte Ergebnis für einen einzelnen Eintrag erzeugen, aber ich möchte die ID-Nummern verwenden, um automatisch zu suchen.

Die Datei BindindDB_All.tsv ist meine Quelldatei mit mehreren Millionen Einträgen. Dadurch wird ein TSV namens aufgerufen " new.tsv " und enthält die gesamte Zeile der Datei BindindDB_All.tsv, wobei die ID (in Spalte 1) 66106 entspricht.

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

Ich möchte so etwas tun:

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

wo es lesen würde Drucken Sie für jede ID die Zeile in new.csv, lesen Sie dann die nächste ID und machen Sie dasselbe.

Die CSV-Datei enthält 1200 Suchbegriffe, die mit mehreren Millionen Möglichkeiten mit jeweils einer eindeutigen ID verglichen werden können. I. brauche es, um NUR Spalte 1 zu durchsuchen, da es die ID in anderen Variablen findet es in jeder Zeile.

Zusammenfassend muss ich in Spalte 1 der Zeile nachsehen, es mit der ersten Nummer in meiner CSV-Datei vergleichen und prüfen, ob es eine Übereinstimmung ist. Wenn es sich nicht um eine Übereinstimmung handelt, muss die nächste Zeile in Spalte 1 usw. überprüft werden, bis die Übereinstimmung gefunden wird. Wenn die Zeile gefunden wird, in der Spalte 1 mit dem ersten CSV-Datenpunkt übereinstimmt, soll die Zeile ausgegeben werden. Dann möchte ich, dass es für den zweiten Eintrag in der CSV wiederholt wird, bis alle 1200 Zeilen gefunden wurden.

Irgendwelche Ideen? Es klingt wie ein Schleifenproblem, aber ich weiß auch nicht, wie ich das zum Laufen bringen soll.

BEARBEITEN:

Da die Leute immer noch bereit zu helfen scheinen, lassen Sie mich versuchen, die Fragen zu beantworten die gepostet wurden.

Hier sind die ersten 6 Einträge meiner realen Daten, die ID-Nummern enthalten, die als Suchparameter verwendet werden.

66106 66107 66108 66109 66110 50127715 

Es gibt keine Spaltennamen, keine anderen Daten. Dies sind Werte, nach denen ich einzeln in einer anderen Datei, einem TSV, suchen möchte. Ich habe auch bezüglich der TSV-Größe falsch gesprochen. Ich habe einen 4-GB-TSV, der auf komprimiert wird 300 MB. Die Datei enthält mehr Einträge, als eines meiner Programme überhaupt anzeigen kann. Nachfolgend finden Sie ein Beispiel für einen einzelnen Eintrag aus mehreren Millionen. Ich MUSS alle diese Daten auf einmal abrufen, damit das Trimmen nicht möglich ist 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-Methyl-2- (1-propylbutyl) – (6aR, 9aS) -3,4,5,8-tetrahydrocyclopenta [4,5] imidazo [2,1-b] purin-4- one :: CHEMBL280307 Phosphodiesterase 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 44.272.162 103.967.010 CHEMBL280307 ZINC28221715 1 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRFRSIVHVVQAGIFVERMYRKSYHMVGLAYPEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAADISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHS Calcium / Calmodulin-abhängige 3″ , 5″ -cyclisches Nukleotidphosph Odiesterase 1A PDE1A_BOVIN P14100 Q08E30, Q28063

Ich bin nicht sicher, wie ich dies als TSV in diesem Feld lesen soll, aber 50127715 ist die erste Spalte, die ID-Spalte. Ich möchte, dass meine anfängliche CSV-Datei, die die interessierenden ID-Nummern enthält, die große TSV-ID-Nummer einzeln in der ersten Spalte durchsucht. Wenn die Nummer in der ersten Spalte enthalten ist, soll diese Zeile in eine Datei geschrieben und dann nach der nächsten ID gesucht werden. Ich möchte alle Ergebnisse in einer einzigen Datei haben.

Ich bin mir sicher, dass es bei all meinen Schritten, um hierher zu gelangen, einen einfacheren Weg gibt, dies zu tun, aber ich bin mir nicht sicher, wie ich das machen soll das klarer. Ich möchte, dass der große TSV in Spalte 1 nach " 66106 " durchsucht wird und die Zeile gefunden wird, in die die gesamte Zeile geschrieben werden soll eine Datei. Suchen Sie dann nach " 66107 " und fügen Sie es derselben Datei hinzu, sobald es gefunden wurde. Auf diese Weise habe ich eine einzelne Datei, kann eine CSV oder TSV sein, mit 1200 Einträgen anstelle von mehreren Millionen.

Kommentare

  • Warum nicht einfach analysieren der TSV direkt? awk -F '\t' trennt Eingabefelder durch Registerkarten. Tatsächlich trennt awk Felder standardmäßig durch zusammenhängende Leerzeichen. Um alle blauäugigen Personen zu erhalten (und den Header beizubehalten), benötigen Sie nur awk -F '\t' 'BEGIN { OFS="\t" } NR==1 { print } NR>1 && $3 = "Blue" { print }'.
  • Ich habe versucht, diesen Befehl für eine Beispieldatei mit dem Namen " test.tsv " mit derselben Eingabe wie oben aufgeführt, jedoch mit ungewöhnlicher Ausgabe. Es wurden nur alle Augenfarben durch " Blau " ersetzt, während alles andere gleich blieb.
  • $3 = "Blue" sollte $3 == "Blue" sein. Ersteres ist eine Aufgabe, letzteres ist ein Vergleich.
  • Ist dies ein CSV oder ein TSV?
  • Das Austeilen der Informationen über Ihre Anforderungen ist zu einem Zeitpunkt nicht ' Ein guter Ansatz, um eine gute Lösung zu finden. Bitte bearbeiten Sie Ihre Frage , um ein repräsentativeres Beispiel dafür zu liefern, was Sie ' versuchen. Fügen Sie eine TSV-Datei, eine CSV-Datei und die erwarteten Ausgabedateien hinzu, die Sie als Eingabe erwarten. Stellen Sie sicher, dass Sie alle Ihre Anwendungsfälle abdecken, z. ob alle Übereinstimmungen gegen Werte in einer Spalte oder unterschiedliche Übereinstimmungen in verschiedenen Spalten usw. sind. Siehe Fragen .

Antwort

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

Es hört sich so an, als würden Sie wirklich versuchen, eine neue zu erstellen Datei pro ID, vorausgesetzt, die IDs sind wie in Ihrem Beispiel eindeutig:

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

oder wenn jede Ausgabedatei den Header enthalten soll:

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

Kommentare

  • Ich habe es aus Gründen der Übersichtlichkeit bearbeitet, aber ich möchte wirklich nur 1 Datei, die diese enthält Aufgrund der enormen Datenmenge habe ich nur versucht, ein Beispiel für Demonstrationszwecke zu erstellen, aber ' bin neu in der Programmierung, daher Ich bin mir nicht sicher, ob ich ' richtig ausdrücke, was ich brauche.

Antwort

Für alle, die dies im fu finden Ich habe eine Lösung. Das erste, was ich tat, war die Konvertierung der TSV in eine CSV mit:

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

Dann suchte ich nach meinem gesuchten Dateicode:

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

Hiermit wird die erste Spalte nach dem Text durchsucht, der in einer separaten CSV enthalten ist. In diesem Fall ist " file1 " die zu durchsuchende Datei und " file2 " enthält die zu suchenden Zeichenfolgen. Beide Dateien haben das CSV-Format.

Dies erzeugte eine separate CSV-Datei, die alle Zeilen in Datei1 enthielt, die eine bestimmte ID in Spalte 1 hatten, die mit einer der in Datei2 enthaltenen IDs übereinstimmt.

Ich hoffe, das hilft Jemand eines Tages, weil dies mein Gehirn seit Wochen erschüttert hat. Ich habe die Lösung nicht einmal selbst bekommen, mein Chef musste sie mir zeigen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.