2013-05-01 11 views
26

Ich bin absolut Anfänger in Bash, also hier ist mein Problem:
Eine beliebige Anzahl von Zeilen Text wird von Standard-Eingabe gegeben.
Ausgabe: Anzahl der sich nicht wiederholenden Zeilen.

Zum Beispiel:
INPUT:
Einzigartige Zeilen in Bash

Sie schwarze Schuhe trägt.
Mein Name ist Johny.
Ich hasse Montag.
Mein Name ist Johny.
Ich verstehe dich nicht.
Sie trägt schwarze Schuhe.

OUTPUT:

Antwort

69

Sie versuchen, uniq verwendet, könnte man uniq und gehen Sie wie folgt

sort file | uniq -u | wc -l 
+1

ich hinzugefügt, um den 'sort' Befehl in der Mischung. Netter Haken ... Ich hatte es in der Reihenfolge von – Ding

+13

in den man-Seiten, die es angibt: Hinweis: 'uniq' erkennt wiederholte Zeilen nicht, es sei denn, sie sind benachbart. Vielleicht möchten Sie die Eingabe zuerst sortieren oder "sort -u" ohne "uniq" verwenden. Die Vergleiche berücksichtigen auch die Regeln, die durch 'LC_COLLATE 'festgelegt sind. Es hat auch funktioniert .... –

7

Hier ist, wie ich das Problem lösen würde:

... | awk '{n[$0]++} END {for (line in n) if (n[line]==1) num++; print num}' 

Aber das ist ziemlich undurchsichtig. Hier ist eine (leicht) lesbare Art und Weise, es zu betrachten (erfordert bash Version 4)

... | { 
    declare -A count # count is an associative array 

    # iterate over each line of the input 
    # accumulate the number of times we've seen this line 
    # 
    # the construct "IFS= read -r line" ensures we capture the line exactly 

    while IFS= read -r line; do 
     ((count["$line"]++)) 
    done 

    # now add up the number of lines who's count is only 1   
    num=0 
    for c in "${count[@]}"; do 
     if (($c == 1)); then 
      ((num++)) 
     fi 
    done 

    echo $num 
} 
+0

+1: Ich weiß nicht, warum jemand eine funktionierende Lösung downvote, aber ich mag diese, wie es die wahre Macht der Shell zeigt (zumindest diejenigen, die assoziative Arrays unterstützen). –

+0

auf meinem '99 Maschine die awk Lösung funktionierte nahtlos – sfiore

+0

@sfiore, was ist eine "'99 Maschine"? –