私はbashで全く初心者ですので、ここに私の問題があります:
標準入力から何行ものテキストが与えられます。
出力:繰り返されない行の数。例えば
:
INPUT:
bashのユニークな行
彼女は黒の靴を着用しています。
私の名前はJohnyです。
私は月曜日が嫌いです。
私の名前はJohnyです。
私はあなたを理解していません。
彼女は黒い靴を履いています。
OUTPUT:
私はbashで全く初心者ですので、ここに私の問題があります:
標準入力から何行ものテキストが与えられます。
出力:繰り返されない行の数。例えば
:
INPUT:
bashのユニークな行
彼女は黒の靴を着用しています。
私の名前はJohnyです。
私は月曜日が嫌いです。
私の名前はJohnyです。
私はあなたを理解していません。
彼女は黒い靴を履いています。
OUTPUT:
あなたはuniqのman uniq
を使用しようとすると、以下の
sort file | uniq -u | wc -l
を行うことができますがここで私が問題を解決したい方法は次のとおりです。
... | 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
}
+1:なぜ誰かが働いている解決策をdownvoteするだろうが、私はそれがシェルの真の力(少なくとも連想配列をサポートするもの)を示すので、この1つが好きです。私の'99マシン上の –
awkソリューションはシームレスに機能しました – sfiore
@sfiore、 "'99マシンは何ですか? –
私はミックスで 'sort'コマンドを追加しました。ニースのキャッチ...私は、マニュアルページで – Ding
の順序が間違っていました。注意: 'uniq'は隣接していない限り、繰り返し行を検出しません。最初に入力をソートするか、 'uniq 'なしで' sort -u'を使うとよいでしょう。また、比較は 'LC_COLLATE 'で指定された規則に従います。それはまた働いた.... –