Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[bash] gleiche Zeilen nur einmal ausgeben?
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Tue Feb 08, 2011 8:42 pm    Post subject: [bash] gleiche Zeilen nur einmal ausgeben? Reply with quote

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Tue Feb 08, 2011 10:23 pm    Post subject: Reply with quote

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
View user's profile Send private message
nanos
Tux's lil' helper
Tux's lil' helper


Joined: 22 Jun 2006
Posts: 78

PostPosted: Wed Feb 09, 2011 7:58 am    Post subject: Reply with quote

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
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3942
Location: Hamburg

PostPosted: Wed Feb 09, 2011 12:41 pm    Post subject: Reply with quote

Code:
perl -wne ' print unless $h{$_}++ ' datei
funktioniert, wenn die "text..."(e) alle unterschiedlich sind.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Wed Feb 09, 2011 4:39 pm    Post subject: Reply with quote

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
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Wed Feb 09, 2011 5:05 pm    Post subject: Reply with quote

@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
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3942
Location: Hamburg

PostPosted: Wed Feb 09, 2011 5:43 pm    Post subject: Reply with quote

Code:
perl -wne 'if (m/[\^.+tag|^Mittwoch] ..\...\.2011 ..:..:..$/) { next if $h{$_}++ }; print;' datei
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Wed Feb 09, 2011 5:44 pm    Post subject: Reply with quote

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
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Wed Feb 09, 2011 6:01 pm    Post subject: Reply with quote

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 :D
_________________
Inter Deum Et Diabolum Semper Musica Est.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Wed Feb 09, 2011 6:05 pm    Post subject: Reply with quote

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. :D
Back to top
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3942
Location: Hamburg

PostPosted: Wed Feb 09, 2011 7:35 pm    Post subject: Reply with quote

Code:
perl -wne '$p = $_ if ($. == 5); print if ($. <= 5 || ! m/$p/);' datei
Back to top
View user's profile Send private message
AmonAmarth
l33t
l33t


Joined: 03 Mar 2005
Posts: 727

PostPosted: Thu Feb 10, 2011 12:43 am    Post subject: Reply with quote

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. :D


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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Thu Feb 10, 2011 4:35 pm    Post subject: Reply with quote

AmonAmarth wrote:
sorry aber: dann LERNE es! ...


Danke, sehr hilfreiche Antwort...^^
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1912
Location: Germany

PostPosted: Thu Feb 10, 2011 4:46 pm    Post subject: Reply with quote

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
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3942
Location: Hamburg

PostPosted: Thu Feb 10, 2011 4:51 pm    Post subject: Reply with quote

Ich habe Perl über "learning by doing" kennen- und schätzen gelernt - u.a. gerade über die sogenannten Einzeiler.
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Sat Feb 12, 2011 10:33 am    Post subject: Reply with quote

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Sat Feb 12, 2011 10:56 am    Post subject: Reply with quote

THX @ Knieper,

aber ich habe es mittlerweile mit "awk" gelöst. ;)
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Sat Feb 12, 2011 11:10 am    Post subject: Reply with quote

awk? Du bist ja leidensfähig.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum