Shell-Scripting, mal wieder

soul_rebel

ist immer auf der flucht
Ich will aus einer Ausgabe die Zeilen rauskriegen, die nur einmal vorkommen und dazu uniq verwenden.
Code:
% ../best.awk < out  | sort -g | awk '{ print $3}' | uniq -u | head

SRR001658.6923
SRR001658.7203
SRR001658.5780
SRR001658.6923
SRR001658.7203
SRR001658.5281
SRR001658.1176
SRR001658.1234
SRR001658.1176
SRR001658.14114
So weit so gut, könnte man denken, aber:
Code:
$ ../best.awk < out  | sort -g | awk '{ print $3}' | grep SRR001658.6923 | head
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
SRR001658.6923
scheint so uniq nicht zu sein!? :confused:

Kann sich das jemand erklären? LC_ALL=C habe ich übrigens gesetzt so dass es nichts "sprachliches" ist...

Vielen Dank

P.S: uniq -c behauptetbei der Sequenz tatsächlich 1, grep -c behauptet 53.
 
Zuletzt bearbeitet:
Das sort -g ist an der Stelle natürlich überflüssig, das brauch ich, weil der Aufbau eigentlich komplexer ist.


edit: toll, wenn ich das rausnehme, liefert grep -c 53 und uniq behauptet auch nicht mehr es sei uniq. :confused: x2
Kann das sein, dass die uniq mit 350k lines of input nicht klarkommen? Das wäre sehr schlecht und verwunderlich.
 
scheint so uniq nicht zu sein!?
Bei der zweiten Variante der Pipe fehlt auch der Aufruf von uniq(1), wie soll es da seine Arbeit verrichten?

Die erste Variante funktioniert zudem nur bei schönem Wetter, da einerseits anhand von Feld 1 (2, 3, ...) sortiert wird und andererseits die Eindeutigkeit anhand von Feld 3 festgestellt werden soll. Das passt nicht wirklich zusammen, da die Werte von Feld 3 noch immer in beliebiger Reihenfolge stehen können. Und ohne (Vor)Sortierung bringt der Aufruf von uniq(1) recht wenig.
Code:
../best.awk < out | awk '{ print $3}' | sort --unique | head
So wird eher ein Schuh draus.
 
Das mit dem whitespace war ein Schnellschuss.

Ich denke, Yetano hat das Problem erfasst, du sortierst an der falschen Stelle:

A 23
C 23
B 24
-->sort
A 23
B 24
C 23
-->awk
23
24
23
-->uniq
23
24
23
 
Bei der zweiten Variante der Pipe fehlt auch der Aufruf von uniq(1), wie soll es da seine Arbeit verrichten?
Der zweite Aufruf war ja auch nur zum Überprüfen der uniq-ness.
Die erste Variante funktioniert zudem nur bei schönem Wetter, da einerseits anhand von Feld 1 (2, 3, ...) sortiert wird und andererseits die Eindeutigkeit anhand von Feld 3 festgestellt werden soll.
Das war auch der Sinn der Sache, Feld 1 enthält einen Qualitätswert, Feld 3 eine ID. Ich wollte, dass mir nach Qualität sortiert die ersten eindeutigen angezeigt werden.
Und ohne (Vor)Sortierung bringt der Aufruf von uniq(1) recht wenig.
Genau das hatte ich übersehen :/

Ich habe jetzt ein bisschen drum herum gewurschtelt. Danke für die Aufklärung auf jeden Fall ;)


edit: @Schläfer_ die ersten drei schritte waren mir klar, der letzte halt nicht...
 
Und dabei steht's groß und breit in der man-page! Allerdings wird man bei genauem Lesen der man-pages auch feststellen, dass "sort --unique" einem "uniq" entspricht und nicht "uniq -u". Verdammt. :o

Folglich führt mein vorherigen Codeschnippsel nicht zum Ziel und es muss doch bei einer Kombination von sort(1) und uniq(1) bleiben.
Code:
../best.awk < out | awk '{ print $3 }' | sort | uniq -u | head
 
Zurück
Oben