2016-09-11 2 views
1

Verwendung Ich habe einen Eingang, wie unten:die gleichen zusammenhängenden Linien Drucken nur einmal shell/awk

Sep 9 09:22:11 
Hello 
Hello 
Sep 9 10:23:11 
Hello 
Hello 
Hello 
Sep 10 11:23:11 

I den Ausgang, wie unten erwarten: (dieselben sind, zusammenhängende Linien, die durch nur eine Leitung ausgetauscht)

Sep 9 09:22:11 
Hello 
Sep 9 10:23:11 
Hello 
Sep 10 11:23:11 

Konnte mir jemand helfen, dieses schnell zu lösen, das Shell oder awk verwendet?

Antwort

1

Mit awk Sie können dies tun:

awk '$0 != prev; {prev=$0}' file 

Sep 9 09:22:11 
Hello 
Sep 9 10:23:11 
Hello 
Sep 10 11:23:11 

Befehl Breakup:

$0 != prev; # if previous line is not same as current then print it 
{prev=$0}  # store current line in a variable called prev 
+0

Vielen Dank. Es funktioniert gut – loveclassic

+0

Gut zu wissen, dass es geklappt hat, [Sie können die Antwort als akzeptiert markieren, indem Sie auf ** Häkchen ** oben links in dieser Antwort klicken] (http://meta.stackexchange.com/a/5235/160242) – anubhava

1

Um Wiederholungen von Linien zu entfernen, verwenden uniq:

uniq File 

Mit Ihrer Abtastwerteingang zum Beispiel:

$ uniq File 
Sep 9 09:22:11 
Hello 
Sep 9 10:23:11 
Hello 
Sep 10 11:23:11 

Obwohl der Name, dass uniq beschäftigt sich mit einzigartigen Linien bedeuten kann, tut es nicht: es für benachbarte wiederholt Linien sieht und in der Standardeinstellung die Wiederholungen entfernt.

+1

Sie haben Recht. Ich habe allerdings festgestellt, dass dieser Befehl nicht nach benachbarten wiederholten Zeilen sucht. Eigentlich funktioniert es gut. Danke vielmals – loveclassic

0

Nur weil Sie für Shell zu gefragt, obwohl die gegebenen Antworten sind alle besseren Lösungen -

last='' 
while read line 
do if [[ "$line" -eq "$last" ]] 
    then continue 
    else echo "$line" 
     last="$line" 
    fi 
done < infile 

Dies ist einfach, klar, und wahrscheinlich langsamer als entweder awk oder uniq.

Verwandte Themen