Помогите отсортировать таблицу на BASH
Подскажите как посчитать количество одинаковых значений в столбце так, чтобы в итоге получился список строк в том же порядке и без удаленных дубликатов.
sort file | uniq -c меняет порядок строк и удаляет дубликаты. попробовал пронумеровать строки cat или nl -ba file , чтобы потом можно было восстановить порядок, но все равно не понимаю как посчитать повторяющиеся строки без изменения первоначального порядка строк в столбце.
пробую вот так:
nl -ba col4.tmp > file1.tmp
sort -k2 file2.tmp | uniq -f2 -c > file3.tmp
но все равно дубли удаляются
– Нужно из вот такого:
текст1
текст2
текст1
текст1
текст2
текст3
– Сделать вот такое:
текст1;3
текст2;2
;2
текст1;3
;2
текст1;3
текст2;2
текст3;1
Пустые строки тоже нельзя удалять, их нужно тоже посчитать.
Был бы благодарен за помощь!!
Ответы (1 шт):
Как вариант попробовать создать функцию:
sorter() {
#Создаем временный файл, который в дальнейшем будем обрабатывать
cat "${1}" > "${1}".tmp
#Запускаем цикл, считывая две переменные count и string
while IFS='~' read count row; do
#Меняем значение в temp файле, на нужные
sed -i "/^${row}$/s/$/;${count}/" "${1}".tmp
#Передаем в цикл отсортированный список уникальных записей, в данном случае разделитель ~
#При необходимости разделитель меняется в двух местах IFS='~' и \1~
done< <(sort "${1}" | uniq -c | sed -r 's/^[ \t]+([0-9]+)[ \t]+/\1~/')
}
И запускаем ее передавая параметр файл. После запуска в том же каталоге будет создаваться еще один файл, с дополнительным расширением .tmp, в нем и будут строки отсортированные по примеру.
sorter ./file1.txt
cat ./file1.txt.tmp