У меня есть следующие данные в нескольких строках:
foo
bar
qux
zuu
sdf
sdfasdf
Что я хочу сделать, это преобразовать их с одной строкой и запятыми:
foo,bar,qux,zuu,sdf,sdfasdf
Какой лучший однострочный unix для этого?
Использование команды paste:
paste -d, -s file
aaa
bbb
ccc
ddd
cat file | xargs
aaa bbb ccc ddd
cat file | xargs | sed -e 's/ /,/g'
aaa,bbb,ccc,ddd
xargs -a your_file | sed 's/ /,/g'
это более короткий путь
Есть много способов, которыми это может быть достигнуто. Инструмент, который вы используете, в основном зависит от ваших собственных предпочтений или опыта.
Используя команду tr:
tr '\n' ',' < somefile
Использование awk:
awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
на основе вашего примера ввода, эта строка 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
-v
если вы хотите, чтобы переменные были доступны в блоке BEGIN, чуть более кратко awk '$1=$1' RS= OFS=, file
.
-v RS=
вместо -vRS=
.
Perl однострочный:
perl -pe'chomp, s/$/,/ unless eof' file
или, если вы хотите быть более загадочным:
perl '-peeof||chomp&&s/$/,/' file
perl '-peeof||s|$/$|,|' file
perl -pe 'eof or s#\n$#,#' thing
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file
Это создаст резервную копию исходного файла с расширением .bak, а затем изменяет исходный файл
\r
. Вы можете проверить это, отправив входные данные вhd
илиhexdump
.\r
(вместе с\n
)0a0d
двухбайтовые последовательности0a0d
. Исправить с помощью|sed 's/\r//g'
.