2013-05-01 5 views
26

私はbashで全く初心者ですので、ここに私の問題があります:
標準入力から何行ものテキストが与えられます。
出力:繰り返されない行の数。例えば


INPUT:
bashのユニークな行

彼女は黒の靴を着用しています。
私の名前はJohnyです。
私は月曜日が嫌いです。
私の名前はJohnyです。
私はあなたを理解していません。
彼女は黒い靴を履いています。

OUTPUT:

答えて

69

あなたはuniqのman uniqを使用しようとすると、以下の

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

私はミックスで 'sort'コマンドを追加しました。ニースのキャッチ...私は、マニュアルページで – Ding

+13

の順序が間違っていました。注意: 'uniq'は隣接していない限り、繰り返し行を検出しません。最初に入力をソートするか、 'uniq 'なしで' sort -u'を使うとよいでしょう。また、比較は 'LC_COLLATE 'で指定された規則に従います。それはまた働いた.... –

7

を行うことができますがここで私が問題を解決したい方法は次のとおりです。

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

しかし、それはかなり不透明です。ここではそれを見て(わずか)より読みやすい方法は、(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 
} 
+0

+1:なぜ誰かが働いている解決策をdownvoteするだろうが、私はそれがシェルの真の力(少なくとも連想配列をサポートするもの)を示すので、この1つが好きです。私の'99マシン上の –

+0

awkソリューションはシームレスに機能しました – sfiore

+0

@sfiore、 "'99マシンは何ですか? –