web-dev-qa-db-ja.com

bashの一意の行

私は絶対にbashの初心者ですので、ここに私の問題があります:
任意の数のテキスト行が標準入力から提供されます。
出力:非繰り返し行の数。

例えば:
入力:

彼女は黒い靴を履いています。
私の名前はジョニーです。
私は月曜日が嫌いです。
私の名前はジョニーです。
わかりません。
彼女は黒い靴を履いています。

出力:

2

45
john blackwood

Uniq man uniqおよび次の操作を行います

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

問題を解決する方法は次のとおりです。

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

しかし、それはかなり不透明です。これは(slightly)より見やすい方法です(bashバージョン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
}
8
glenn jackman