Это можно сделать разными способами, с помощью многих инструментов, например. с awk
следующим образом:
cat f.txt | awk 'BEGIN{ORS="\\|"}1'
@don_cristi правильно заметил, что «Это будет печатать конечный символ \| и не будет завершать новую строку», так что вот версия, которая исправляет оба, если это необходимо для вашего использования -case:
awk 'p{printf "%s\\|",p} {p=$0} END{print p}'
Вы не сортируете файл перед его фильтрацией. Из справочной страницы:
Примечание:
uniq
не обнаруживает повторяющиеся строки, если они не являются смежными. Вы можете сначала отсортировать ввод или использоватьsort -u
безuniq
. Кроме того, сравнения соблюдают правила, указанные вLC_COLLATE
.
Вам также необходимо обработать все строки, которые вы хотите подсчитать, за один раз. В настоящее время вы обрабатываете типы файлов по одному, поэтому uniq -c
правильно говорит вам, что у вас есть по одному из каждого типа — он всегда видит только один тип файла за раз.
file * | sort | uniq -c
было бы более подходящим (предположительно с более конкретным глобусом или даже списком файлов для обработки).