So filtern Sie Spalten in einer TSV-Datei mit Milliarden Zeilen

So filtern Sie Spalten in einer TSV-Datei mit Milliarden Zeilen

Ich arbeite mit einer Liste mit Milliarden Datenzeilen.

Ich habe Daten wie diese: Bildbeschreibung hier eingeben

Wie Sie sehen, stehen in der vierten Spalte (Genspalte) Gennamen, aber nicht alle Zeilen haben einen „Gennamen“. Ich muss die vollständige Liste der „Gennamen“ aus der vierten Spalte abrufen.

Wie kann ich bekommen, was ich brauche?

Antwort1

Versuchen Sie es mit diesem Einzeiler:

cut -f4 in.tsv | tail -n +2 | grep -P '\S'

Details:
cut -f4 in.tsv: gibt die vierte TAB-getrennte Spalte der Eingabedatei aus in.tsv.
tail -n +2: entfernt die erste Zeile (Kopfzeile).
grep -P '\S': behält nur die Zeilen bei, die keine Leerzeichen enthalten, d. h. entfernt Leerzeilen. -Pweist an, grepreguläre Perl-Ausdrücke zu verwenden.

Wenn Sie nur die eindeutigen Gennamen benötigen, fügen Sie sort -uFolgendes hinzu:

cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u

Antwort2

Es ist nicht klar, was Ihre Anforderung ist. Angenommen, dass es sich, abgesehen von der ersten Zeile, nur um die Werte der vierten Spalte (mit der Bezeichnung „Gen“) handelt, deren Wert in der sechsten Spalte (mit der Bezeichnung „Produkt“) sich von „hypothetischem Protein“ unterscheidet.

grep -v "hypothetical protein" < <(tail -n +2 file.tsv) | cut -f4 -d$'\t'

Erläuterung

tail -n +2 file.tsv

schließt die erste Zeile aus („locus_tag“, „type“ usw.)

grep -v "hypothetical protein"

schließt alle Zeilen aus, die die Zeichenfolge „hypothetisches Protein“ enthalten

cut -f4 -d$'\t'

druckt die vierte Spalte.

Antwort3

Das sieht nach einer Aufgabe für aus awk. Sie könnten Folgendes versuchen:

awk '{if ($4); print $4 $7}' filename.tsv

Hier der hilfreiche Vorschlag aus den Kommentaren:

awk 'BEGIN { FS = "\t" } ; $4 != "" { print $4 "\t" $7}'

Antwort4

Mit awk:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t': Auf Registerkarte aufteilen.
  • $4 != "": Wenn das 4. Feld nicht leer ist…
  • {arr[$4] = 1}: …verwenden Sie es als Index in einer Array-Zuweisung.
    • Nachfolgende Instanzen desselben Indexes überschreiben den Array-Eintrag, es werden keine Duplikate gespeichert.
    • Der zugewiesene Wert ( 1) ist beliebig 0oder "blergh"würde genauso gut funktionieren.
  • END: Wenn alle Zeilen gelesen wurden…
  • {for (idx in arr) print idx}: …alle Indizes drucken.

verwandte Informationen