Изменение разделителя команды uniq

Я хочу, чтобы вывод команды uniq был разделен запятой, так что вместо:

     30 hello
     31 world
     36 hey_there
    142 i_am_bigest

Я получу:

30,hello
31,world
36,hey_there
142,i_am_biggest

У моего ввода нет пробелов, но просто использование sed или tr может быть проблемой, так как число ведущих пробелов меняется в зависимости от количества десятичных цифр в счетчике.

Ответ 1

Подключите выход к

sed -e 's/^ *//;s/ /,/'

Это сначала удаляет ведущие пробелы (^ *), а затем заменяет первое пространство запятой.

Ответ 2

man uniq (по крайней мере, на Mac OS X, aka BSD) не дает никакого способа справиться с этим. Лучше всего, вероятно, sed:

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

Вывод из uniq -c состоит из некоторых пробелов, числа, пробела и входной строки.

Основная идея заключается в том, что sed script ищет произвольное количество пробелов, число и пробел и заменяет их числом и запятой. Рассматривая спецификацию POSIX для uniq, на выходе не должно быть ведущих заготовок (формат printf() должен быть "%d %s"), но ведущие пробелы нормальны на практике (при достаточно малом количестве повторов, в Mac OS X формат вывода printf() эффективен "%5d %s").

Ответ 3

вывести вывод на:

perl -lane '{print join ",", @F}'

Ответ 4

  1. Использование printf работает:

    xargs -L 1 printf '%s,%s\n' < file
    
  2. Используя bash:

    printf '%s,%s\n' $(<file)
    
  3. В оболочке POSIX это также будет работать:

    printf '%s,%s\n' $( ...various commands... | uniq -c )