2012-01-28 1 views

ответ

4

Вы можете sort вход и перейти к uniq -c:

$ sort input_file | uniq -c 
2 a 
2 b 
1 f 
1 g 
1 z 

Если вы хотите, чтобы цифры на право использовать awk их переключения:

$ sort input_file | uniq -c | awk '{print $2, $1}' 
a 2 
b 2 
f 1 
g 1 
z 1 

С другой стороны, сделать все это в awk

$ awk ' 
{ 
    ++count[$1] 
} 
END { 
    for (word in count) { 
     print word, count[word] 
    } 
} 
' input_file 
f 1 
g 1 
z 1 
a 2 
b 2 
1
cat text | sort | uniq -c 

должны сделать работу

+2

http://uuoc.com/ – Johnsyweb

1

Try:

awk '{ freq[$1]++; } END{ for(c in freq) { print c, freq[c] } }' test.txt 

Где test.txt будет ваш входной файл.

1

Вот bash - только версия (требуется версия версии 4), используя associative array.

#! /bin/bash 

declare -A count 
while read val ; do 
    count[$val]=$((${count[$val]} + 1)) 
done < your_intput_file # change this as needed 

for key in ${!count[@]} ; do 
    echo $key ${count[$key]} 
done 
+0

Требуется версия bash 4 для ассоциативных массивов –

+0

Упрощение: '((count [$ val] ++))'. Кроме того, вы должны почти всегда использовать '-r' с' read'. Всегда указывайте переменные: 'для ключа в '$ {! Count [@]}" 'и' echo' $ key $ {count [$ key]} "'. –

0

Это может работать для вас:

cat -n file | 
sort -k2,2 | 
uniq -cf1 | 
sort -k2,2n | 
sed 's/^ *\([^ ]*\).*\t\(.*\)/\2 \1/' 

Этот выход число вхождений каждой строки в том порядке, в котором они появляются.

Смежные вопросы