Превращение нескольких строк в одну строку с разделением запятыми (Perl / Sed / AWK)

67

У меня есть следующие данные в нескольких строках:

foo
bar
qux
zuu
sdf
sdfasdf

Что я хочу сделать, это преобразовать их с одной строкой и запятыми:

foo,bar,qux,zuu,sdf,sdfasdf

Какой лучший однострочный unix для этого?

  • 0
    Если приведенные ниже решения не дают требуемых результатов, например, отображается только содержимое последней строки, возможно, на входе могут быть нежелательные управляющие символы, например, \r . Вы можете проверить это, отправив входные данные в hd или hexdump . \r (вместе с \n ) 0a0d двухбайтовые последовательности 0a0d . Исправить с помощью |sed 's/\r//g' .
  • 0
    Этот вопрос является дубликатом, но не все ответы есть.
Теги:
awk
sed

8 ответов

114
Лучший ответ

Использование команды paste:

paste -d, -s file
  • 3
    Вставить это потрясающая команда. Работает как чемпион!
  • 7
    Но как сделать это для переменной или трубы? Обновление себя: использование -s без значения .... | вставить -d, -s
Показать ещё 2 комментария
56

Файл

aaa
bbb
ccc
ddd

xargs

cat file | xargs

результат

aaa bbb ccc ddd 

xargs изменен

cat file | xargs | sed -e 's/ /,/g'

результат

aaa,bbb,ccc,ddd 
  • 1
    xargs превращает многострочный в одну строку через пробел, затем sed заменяет все пробелы на ',' (или ',' если вы будете использовать sed -e 's / / \, / g' (кстати, -e может быть опущен)
  • 0
    обычно xargs не предназначен для t, но работает :)
Показать ещё 3 комментария
10

xargs -a your_file | sed 's/ /,/g'

это более короткий путь

  • 0
    кроме случаев, когда в ваших строках есть пробелы ...
  • 0
    sed -e 's / / + / g' test | xargs | sed 's / /, / g; s / + / / g' это была просто идея, как использовать xargs :) не думайте, что это серьезно
6

Есть много способов, которыми это может быть достигнуто. Инструмент, который вы используете, в основном зависит от ваших собственных предпочтений или опыта.

Используя команду tr:

tr '\n' ',' < somefile

Использование awk:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
  • 0
    обе ваши команды будут генерировать запятую
  • 0
    да, я могу исправить это в awk, но не в tr, дай мне мин.
Показать ещё 4 комментария
6

на основе вашего примера ввода, эта строка awk работает. (без запятой)

awk -vRS="" -vOFS=',' '$1=$1' file

Тест:

kent$  echo "foo
bar
qux
zuu
sdf
sdfasdf"|awk -vRS="" -vOFS=',' '$1=$1' 
foo,bar,qux,zuu,sdf,sdfasdf
  • 0
    Вам нужно использовать -v если вы хотите, чтобы переменные были доступны в блоке BEGIN, чуть более кратко awk '$1=$1' RS= OFS=, file .
  • 3
    Для ясности и во избежание удивления, когда вы позже попробуете использовать переменную в блоке BEGIN, я бы всегда использовал -v, если только для переменной не заданы разные значения между файлами. К сведению, пропуская пробел между -v и именем переменной, ваш скрипт не обязательно будет зависеть от gawk, поэтому я бы использовал -v RS= вместо -vRS= .
Показать ещё 1 комментарий
6

Perl однострочный:

perl -pe'chomp, s/$/,/ unless eof' file

или, если вы хотите быть более загадочным:

perl '-peeof||chomp&&s/$/,/' file
  • 5
    Еще более загадочно: perl '-peeof||s|$/$|,|' file
  • 1
    sid_com, мне нравится ваш выбор разделителей подстановки: D ... perl -pe 'eof or s#\n$#,#' thing
Показать ещё 1 комментарий
1
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
  • 0
    слишком сложно. Пожалуйста, объясните @protist.
1
perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

Это создаст резервную копию исходного файла с расширением .bak, а затем изменяет исходный файл

Ещё вопросы

Сообщество Overcoder
Наверх
Меню