View previous topic :: View next topic |
Author |
Message |
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Tue Feb 08, 2011 8:42 pm Post subject: [bash] gleiche Zeilen nur einmal ausgeben? |
|
|
Hallo Zusammen,
ich habe mal wieder ein kleine Problem mit einem Shellscript.
Ich habe eine Datei, die z.B. so aussieht:
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
Dienstag 08.02.2011 21:22:59
text4
text5
Dienstag 08.02.2011 21:22:59
text6
Dienstag 08.02.2011 21:22:59
text7
text8
text9
text10
...and so on... |
Nun möchte ich gerne alle gleichen Zeitstempel entfernen, bis auf den ersten.
Leider geht "uniq" hier leider nicht, da die Zeilen die gleich sind, untereinander stehen müssten.
"sort -u" geht leider auch nicht, da das den Text sortieren würde und das wäre fatal....
Hat Jemand eine Idee, wie man das lösen könnte? |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Tue Feb 08, 2011 10:23 pm Post subject: |
|
|
Was genau magst du als Ergebnis haben?
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
text4
text5
text6
text7
text8
text9
text10
...and so on... |
oder:
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
|
_________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
nanos Tux's lil' helper
Joined: 22 Jun 2006 Posts: 78
|
Posted: Wed Feb 09, 2011 7:58 am Post subject: |
|
|
Vielleicht nicht die eleganteste Lösung aber sie funktioniert.
Die Zeilen in der Datei test:
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
Dienstag 08.02.2011 21:22:59
text4
text5
Dienstag 08.02.2011 21:22:59
text6
Dienstag 08.02.2011 21:22:59
text7
text8
text9
text10
...and so on...
|
Code: | nl test | sort -k 2 -u | sort | sed 's/^.......//' |
Ausgabe:
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
text4
text5
text6
text7
text8
text9
text10
...and so on...
|
|
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3942 Location: Hamburg
|
Posted: Wed Feb 09, 2011 12:41 pm Post subject: |
|
|
Code: | perl -wne ' print unless $h{$_}++ ' datei | funktioniert, wenn die "text..."(e) alle unterschiedlich sind. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Wed Feb 09, 2011 4:39 pm Post subject: |
|
|
Finswimmer wrote: | Was genau magst du als Ergebnis haben? ... |
Genau so:
Code: | Dienstag 08.02.2011 21:22:59
text1
text2
text3
text4
text5
text6
text7
text8
text9
text10
...and so on... |
@ nanos
Deine Lösung fünktioniert leider nicht, da die Texte dann sortiert werdern.
@ toralf
Leider sind die Texte nicht immer unterschiedlich...
Ich will halt nur die mehrfach vorhandenen Zeitstempel raushaben.... |
|
Back to top |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Wed Feb 09, 2011 5:05 pm Post subject: |
|
|
@toralf: Ich kann kein Perl, aber man kann doch deine Lösung so aufbohren, dass sie nur dann Zeilen auf "Unterschiedlichkeit" prüft, wenn sie /^(Mon|Diens|Donners|Frei|Sams|Sonn)tag|Mittwoch/ matchen, oder? Denn sollte es doch 3POs Vorstellungen genügen, denke ich mal. _________________ Inter Deum Et Diabolum Semper Musica Est. |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3942 Location: Hamburg
|
Posted: Wed Feb 09, 2011 5:43 pm Post subject: |
|
|
Code: | perl -wne 'if (m/[\^.+tag|^Mittwoch] ..\...\.2011 ..:..:..$/) { next if $h{$_}++ }; print;' datei |
|
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Wed Feb 09, 2011 5:44 pm Post subject: |
|
|
Ich habe mir gerade die Files nochmal angesehen und festgestellt, das der erste Zeitstempel immer in Zeile 5 ist.
Jetzt müsste ich nur nur noch so vorgehen:
--> Lösche alle Zeilen, die aussehen wie Zeile 5, aber lasse Zeile 5 unberührt. <--
Nur wie mache ich das am besten? |
|
Back to top |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Wed Feb 09, 2011 6:01 pm Post subject: |
|
|
Nimm Toralfs Ansatz
Und was mir allg. mal auffällt: Ich glaube fast, du hättest die Sache die du da machst mal global in Perl oder so schreiben sollen anstatt 2001 verschieden Bashskripte zu haben _________________ Inter Deum Et Diabolum Semper Musica Est. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Wed Feb 09, 2011 6:05 pm Post subject: |
|
|
Das ist Problem ist nur, dass ich kein Perl kann. bei den Bashscripten blicke ich wenigstens noch einigermaßen durch.
Sicherlich ist der Ansatz von toralf nicht schlecht und btw: THX dafür, aber ich würde halt gerne bei einer Sprache bleiben - vor allem bei einer, die ich auch verstehe. |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3942 Location: Hamburg
|
Posted: Wed Feb 09, 2011 7:35 pm Post subject: |
|
|
Code: | perl -wne '$p = $_ if ($. == 5); print if ($. <= 5 || ! m/$p/);' datei |
|
|
Back to top |
|
|
AmonAmarth l33t
Joined: 03 Mar 2005 Posts: 727
|
Posted: Thu Feb 10, 2011 12:43 am Post subject: |
|
|
3PO wrote: | Das ist Problem ist nur, dass ich kein Perl kann. bei den Bashscripten blicke ich wenigstens noch einigermaßen durch.
Sicherlich ist der Ansatz von toralf nicht schlecht und btw: THX dafür, aber ich würde halt gerne bei einer Sprache bleiben - vor allem bei einer, die ich auch verstehe. |
sorry aber: dann LERNE es! perl ist nich so kompliziert und du kannst dir deine probleme selber schnell und effizient lösen. Necoro hat da schon ziemlich recht... |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Thu Feb 10, 2011 4:35 pm Post subject: |
|
|
AmonAmarth wrote: | sorry aber: dann LERNE es! ... |
Danke, sehr hilfreiche Antwort...^^ |
|
Back to top |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Thu Feb 10, 2011 4:46 pm Post subject: |
|
|
3PO wrote: | AmonAmarth wrote: | sorry aber: dann LERNE es! ... |
Danke, sehr hilfreiche Antwort...^^ |
man perlintro _________________ Inter Deum Et Diabolum Semper Musica Est. |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3942 Location: Hamburg
|
Posted: Thu Feb 10, 2011 4:51 pm Post subject: |
|
|
Ich habe Perl über "learning by doing" kennen- und schätzen gelernt - u.a. gerade über die sogenannten Einzeiler. |
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Sat Feb 12, 2011 10:33 am Post subject: |
|
|
test.sh:
Code: |
n2="[[:digit:]]\{2\}"
n4="[[:digit:]]\{4\}"
day="[DFMS][a-z]*"
date="${n2}.${n2}.${n4}"
time="${n2}:${n2}:${n2}"
s="${day} ${date} ${time}"
last=""
while read line; do
match=`echo "${line}" | grep -x "${s}"`
if [ "${match}" ]; then
if [ "${match}" != "${last}" ] ; then
echo "${match}"
fi
last="${match}"
else
echo "${line}"
fi
done |
data.txt:
Code: |
Dienstag 08.02.2011 21:22:58
text1
text2
text3
Dienstag 08.02.2011 21:22:58
text4
text5
Dienstag 08.02.2011 21:22:59
text6
Dienstag 08.02.2011 21:22:59
text7
text8
text9
text10 |
Vermutetes Wunschergebnis:
Code: |
>dash test.sh < data.txt
Dienstag 08.02.2011 21:22:58
text1
text2
text3
text4
text5
Dienstag 08.02.2011 21:22:59
text6
text7
text8
text9
text10 |
Edit: Hab jetzt erst die Diskussion gelesen. Verzichte auf Perl, das gehört in den Orkus genauso wie C++ oder PHP. _________________ Je dümmer desto Gnome/KDE. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Feb 12, 2011 10:56 am Post subject: |
|
|
THX @ Knieper,
aber ich habe es mittlerweile mit "awk" gelöst. |
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Sat Feb 12, 2011 11:10 am Post subject: |
|
|
awk? Du bist ja leidensfähig. _________________ Je dümmer desto Gnome/KDE. |
|
Back to top |
|
|
|