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

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

foo
bar
qux
zuu
sdf
sdfasdf

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

foo,bar,qux,zuu,sdf,sdfasdf

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

Ответ 1

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

paste -d, -s file

Ответ 2

Файл

aaa
bbb
ccc
ddd

xargs

cat file | xargs

результат

aaa bbb ccc ddd 

xargs изменен

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

результат

aaa,bbb,ccc,ddd 

Ответ 3

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

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

Ответ 4

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

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

tr '\n' ',' < somefile

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

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile

Ответ 5

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

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

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

perl '-peeof||chomp&&s/$/,/' file

Ответ 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

Ответ 7

perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

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

Ответ 8

sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'