Ich arbeite mit einer Liste mit Milliarden Datenzeilen.
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. -P
weist an, grep
reguläre Perl-Ausdrücke zu verwenden.
Wenn Sie nur die eindeutigen Gennamen benötigen, fügen Sie sort -u
Folgendes 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 beliebig0
oder"blergh"
würde genauso gut funktionieren.
END
: Wenn alle Zeilen gelesen wurden…{for (idx in arr) print idx}
: …alle Indizes drucken.