Изменение разделителя команды 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 может быть проблемой, поскольку количество начальных пробелов зависит от количества десятичных цифр в счете.


person eran    schedule 10.06.2013    source источник
comment
Этот Q. в частности выглядит как изменение вывода ... | sort -rn | uniq -c.   -  person agc    schedule 16.01.2019


Ответы (5)


Направьте вывод на

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

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

person nneonneo    schedule 10.06.2013

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

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

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

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

person Jonathan Leffler    schedule 10.06.2013

направить вывод на:

perl -lane '{print join ",", @F}'
person Vijay    schedule 10.06.2013
comment
Как и в случае с решением на основе awk, это не работает, когда строки ввода имеют несколько полей в соответствии с Perl. Например, при отсортированном вводе, состоящем из 4 строк, содержащих aaa aaa aaa aaa, и 5 строк, содержащих aba aba aba aba, вывод вашего скрипта (после sort и uniq -c) будет состоять из двух строк: 4,aaa,aaa,aaa,aaa и 5,aba,aba,aba,aba; обратите внимание на лишние (и нежелательные) запятые. - person Jonathan Leffler; 10.06.2013

  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 )
    
person agc    schedule 16.01.2019

Используя ответ @nneonneo, я написал эту функцию и добавил ее в свой .bashrc:

uniqc(){
    uniq -c |sed -e 's/^ *//;s/ /,/' 
}

Использование вместо doSomething | uniq -c выполните:

doSomething | uniqc
person Isin Altinkaya    schedule 10.04.2021