Добавить в ту же строку в Bash
Файл letters.csv содержит:
b,a,c,
В файле numbers.csv содержится:
32
34
25
13
Я хотел бы добавить numbers.csv в letter.csv следующим образом:
b,a,c,32,34,25,13
Я пробовал это:
sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv >> letters.csv
Однако это добавляет добавленные записи в новую строку:
b,a,c,
32,34,25,13
Я хотел бы, чтобы все записи в одной строке. Как это можно сделать?
Ответы
Ответ 1
Вы можете сделать это только с paste
.
Сначала преобразуйте содержимое в numbers.csv
в значения, разделенные запятыми. -s
- это последовательный параметр, а -d,
указывает запятую как разделитель:
$ paste -sd, numbers.csv
32,34,25,13
Затем добавьте этот вывод в letters.csv
, указав пустой разделитель и замещение процесса:
$ # use -d'\0' for non-GNU version of paste
$ paste -d '' letters.csv <(paste -sd, numbers.csv) > tmp && mv tmp letters.csv
$ cat letters.csv
b,a,c,32,34,25,13
Чтобы изменить команду sed
, отправленную в OP, используйте подстановка команды:
$ sed -i -e "s/$/$(sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv)/" letters.csv
$ cat letters.csv
b,a,c,32,34,25,13
Ответ 2
Вы можете использовать tr
:
cat letters.csv numbers.csv | tr '\n' ',' | sed 's/,$/\n/'
(Надеюсь, это не бесполезное использование cat
.: -))
В конце sed
необходимо заменить последний ,
символом новой строки.
Ответ 3
awk
на помощь!
$ awk 'NR==FNR{printf "%s",$0; next}
{print $0}
END{ORS="\n"; print ""}' letters ORS=, numbers |
sed '$s/,$//' # to delete last ","
b,a,c,32,34,25,13
Ответ 4
awk 'FNR==NR{t=$0;next}{s=s","$0}END{print t s}' letters.csv numbers.csv