# [bash] gleiche Zeilen nur einmal ausgeben?

## 3PO

Hallo Zusammen,

ich habe mal wieder ein kleine Problem mit einem Shellscript.

Ich habe eine Datei, die z.B. so aussieht:

```
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?

----------

## Finswimmer

Was genau magst du als Ergebnis haben?

```
Dienstag 08.02.2011 21:22:59

text1

text2

text3

text4

text5

text6

text7

text8

text9

text10

...and so on...
```

oder:

```
Dienstag 08.02.2011 21:22:59

text1

text2

text3

```

----------

## nanos

Vielleicht nicht die eleganteste Lösung aber sie funktioniert.

Die Zeilen in der Datei test:

```
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...

```

```
nl test | sort -k 2 -u | sort | sed 's/^.......//'
```

Ausgabe:

```
Dienstag 08.02.2011 21:22:59

text1

text2

text3

text4

text5

text6

text7

text8

text9

text10

...and so on...

```

----------

## toralf

```
perl -wne ' print unless $h{$_}++ ' datei
```

funktioniert, wenn die "text..."(e) alle unterschiedlich sind.

----------

## 3PO

 *Finswimmer wrote:*   

> Was genau magst du als Ergebnis haben? ...

 

Genau so:  :Smile: 

```
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.  :Sad: 

@ toralf

Leider sind die Texte nicht immer unterschiedlich...

Ich will halt nur die mehrfach vorhandenen Zeitstempel raushaben....

----------

## Necoro

@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.

----------

## toralf

```
perl -wne 'if (m/[\^.+tag|^Mittwoch] ..\...\.2011 ..:..:..$/) { next if $h{$_}++ }; print;' datei
```

----------

## 3PO

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?

----------

## Necoro

Nimm Toralfs Ansatz  :Smile: 

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  :Very Happy: 

----------

## 3PO

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.   :Very Happy: 

----------

## toralf

```
perl -wne '$p = $_ if ($. == 5); print if ($. <= 5 || ! m/$p/);' datei
```

----------

## AmonAmarth

 *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...

----------

## 3PO

 *AmonAmarth wrote:*   

> sorry aber: dann LERNE es! ...

 

Danke, sehr hilfreiche Antwort...^^

----------

## Necoro

 *3PO wrote:*   

>  *AmonAmarth wrote:*   sorry aber: dann LERNE es! ... 
> 
> Danke, sehr hilfreiche Antwort...^^

 

man perlintro

----------

## toralf

Ich habe Perl über "learning by doing" kennen- und schätzen gelernt - u.a. gerade über die sogenannten Einzeiler.

----------

## Knieper

test.sh:

```

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:

```

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:

```

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

----------

## 3PO

THX @ Knieper,

aber ich habe es mittlerweile mit "awk" gelöst.  :Wink: 

----------

## Knieper

awk? Du bist ja leidensfähig.

----------

