Добавить в ту же строку в 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