Как вы делаете пользовательское форматирование с опцией uniq -c?

Из википедии:

uniq
-c Generate an output report in default style except that each line is preceded by a count of the number of times it occurred. If this option is specified, the -u and -d options are ignored if either or both are also present.

На моей машине он берет число и помещает его в начало каждой строки. Я хочу, чтобы он был помещен в конце строки после запятой. Как это может быть сделано?

Пример:

aa
aa
bb
cc
cc
dd

Должен измениться на:

aa,2
bb,1
cc,2
dd,1

3 ответа

Решение

Вы можете попробовать что-то вроде этого -

awk '{a[$1]++}END{for (i in a) print i,a[i] | "sort"}' OFS="," filename

или же

awk -v OFS="," '{print $2,$1}' <(uniq -c file)

или же

uniq -c file | awk '{printf("%s,%s\n",$2,$1)}'

или же

while IFS=' +|,' read count text; do 
    echo "$text, $count"; 
done < <(uniq -c tmp)

Тестовое задание:

[jaypal:~/Temp] cat file
aa
aa
bb
cc
cc
dd

[jaypal:~/Temp] awk '{a[$1]++}END{for (i in a) print i,a[i] | "sort"}' OFS="," file
aa,2
bb,1
cc,2
dd,1

Test2:

[jaypal:~/Temp] awk -v OFS="," '{print $2,$1}' <(uniq -c file)
aa,2
bb,1
cc,2
dd,1

Test3:

[jaypal:~/Temp] while IFS=' +|,' read count text; do 
echo "$text,$count"; 
done < <(uniq -c tmp)
aa,2
bb,1
cc,2
dd,1

Простые вещи, как это, sed легче чем awk

uniq -c inputfile.txt | sed -e 's/^ *\([0-9]\+\) \(.\+\)/\2,\1/'

Я бы использовал awk как я считаю, это наиболее читабельно

% uniq -c /path/to/input_file | awk -v OFS=',' '
{
    print $2, $1
}
'
aa,2
bb,1
cc,2
dd,1
Другие вопросы по тегам