web-dev-qa-db-fra.com

Des lignes uniques en bash

Je suis absolument novice en bash, voici donc mon problème:
Un nombre quelconque de lignes de texte est fourni à partir de l'entrée standard.
Sortie: nombre de lignes non répétitives.

Par exemple:
CONTRIBUTION:

Elle porte des chaussures noires.
Je m'appelle Johny.
Je déteste le lundi.
Je m'appelle Johny.
Je ne vous comprends pas.
Elle porte des chaussures noires.

SORTIE:

2

45
john blackwood

Vous pouvez essayer d'utiliser uniq man uniq et procédez comme suit

sort file | uniq -u | wc -l
104
Ding

Voici comment je résoudrais le problème:

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

Mais c'est assez opaque. Voici un (légèrement) moyen plus lisible de le voir (nécessite la version 4 de bash)

... | {
    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
}
8
glenn jackman