uniq-frage

dettus

Bicycle User
ich habe bei meinen simulationen teilweise ausgaben wie diese hier:

Code:
# 681500550 ns printr> 0001b182 00000001
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 0001b187 00000001
# 681841250 ns printr> 00000006 6410be07
# 682182550 ns printr> 0001b18c 00000001
# 682182550 ns printr> 00000006 6410be07
# 682523250 ns printr> 0001b191 00000001
# 682523250 ns printr> 00000006 6410be07
# 682864250 ns printr> 0001b196 00000001
# 682864250 ns printr> 00000006 6410be07
# 683204650 ns printr> 0001b19b 00000001
# 683204650 ns printr> 00000006 6410be07
# 683545350 ns printr> 0001b1a0 00000001
# 683545350 ns printr> 00000006 6410be07

wie ihr sehen koennt rechnet mein proggie zu einem bestimmten zeitpunkt etwas, bis die ausgabe endlich stabil wird.
meine frage ist nun, ob ich uniq irgendwie dazu bringe mir nur die letzte dieser zeilen anzuzeigen. manchmal sind das auch ketten von 5-6 werten, dann wird das mit dem durchsuchen naemlich extrem unuebersichtlich.

wie ich die ERSTEN x zeichen beim uniq-en ignorieren kann habe ich schon rausgefunden.... vielleicht kennt auch noch jemand eine dreckige awk-sed-moeglichkeit?
 
Mir ist leider nicht klar, welche Zeilen/Spalten genau du haben willst. Wenn es nur die allerletzte Zeile ist, dann nimm tail(1). Oder welcher der Spalten sollen unique sein?
 
dettus schrieb:
i
Code:
# 681500550 ns printr> 0001b182 00000001
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 0001b187 00000001
# 681841250 ns printr> 00000006 6410be07
[...]
meine frage ist nun, ob ich uniq irgendwie dazu bringe mir nur die letzte dieser zeilen anzuzeigen.[...]

Also Du kannst jeweils die *erste* Zeile ausgeben und alle folgenden mit identischer Feldkombination ignorieren:

Code:
awk '!foo[$4, $5]++'

Ist aber in der Form ein Speicherfresser.

Mit uniq(1) wirst Du hier uebrigens nicht gluecklich werden, weil das ja eine sortierte Eingabe verlangt.
 
MrFixit schrieb:
Mir ist leider nicht klar, welche Zeilen/Spalten genau du haben willst. Wenn es nur die allerletzte Zeile ist, dann nimm tail(1). Oder welcher der Spalten sollen unique sein?
lol.
neee.... die letzte zeile zu einem bestimmten simulationszeitpunkt! sprich, das was vor dem printr steht.


kili schrieb:
Also Du kannst jeweils die *erste* Zeile ausgeben und alle folgenden mit identischer Feldkombination ignorieren:
hmm.. die erste bringt mir nix... ich haette gerne die letzte von so einem block.



insgesamt sollte aus einem
Code:
# 681500550 ns printr> 0001b182 00000001
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 0001b187 00000001
# 681841250 ns printr> 00000006 6410be07
ein
Code:
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 00000006 6410be07
fallen
 
Code:
% awk '{a[$2] = $0} END {for(x in a) print a[x]}' foo | sort -nk2
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 00000006 6410be07
# 682182550 ns printr> 00000006 6410be07
# 682523250 ns printr> 00000006 6410be07
# 682864250 ns printr> 00000006 6410be07
# 683204650 ns printr> 00000006 6410be07
# 683545350 ns printr> 00000006 6410be07

Achtung, Speicherfresser, nur auf moderate Datensaetze anwenden.

Eine Alternative waere, deinem Programm beizubringen, dass es den letzten Wert eines Runs in einem anderen Format ausgibt. Z.B. mit einem '>' anstelle von '#' am Anfang der Zeile. Oder du schreibst hinter die letzte Spalte ein 'FINAL' oder sonst ein Marker. Dann reduziert sich das Problem auf grep(1).
 
Und noch eine haessliche Variante mit konstantem Speicherverbrauch

Code:
% awk '{cur=$2; if (cur != old) {if (old_data) print old_data} else old_data=$0; old=$2} END{print old_data}' foo 
# 681500550 ns printr> 00000006 6410be07
# 681841250 ns printr> 00000006 6410be07
# 682182550 ns printr> 00000006 6410be07
# 682523250 ns printr> 00000006 6410be07
# 682864250 ns printr> 00000006 6410be07
# 683204650 ns printr> 00000006 6410be07
# 683545350 ns printr> 00000006 6410be07
 
Zurück
Oben