Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Append to same line in Bash

The file letters.csv contains:

b,a,c,

The file numbers.csv contains:

32
34
25
13

I would like to append numbers.csv to letters.csv like this:

b,a,c,32,34,25,13

I have tried this:

sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv >> letters.csv

However, this puts the appended entries on a new line:

b,a,c,
32,34,25,13

I would like all entries on the same line. How can this be done?

like image 269
IslandPatrol Avatar asked Nov 05 '16 01:11

IslandPatrol


3 Answers

You can do it with paste alone.

First, convert contents in numbers.csv to comma-separated values. -s is the serial option and -d, specifies comma as delimiter:

$ paste -sd, numbers.csv
32,34,25,13

Then append this output to letters.csv by specifying an empty delimiter and process substitution:

$ # 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


To modify sed command posted in OP, use command substitution:

$ 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
like image 122
Sundeep Avatar answered Oct 02 '22 20:10

Sundeep


You can use tr:

cat letters.csv numbers.csv | tr '\n' ',' | sed 's/,$/\n/'

(I hope this is not a useless use of cat. :-))

The sed at the end is needed to replace the last , with a newline character.

like image 42
pfnuesel Avatar answered Oct 02 '22 19:10

pfnuesel


awk to the rescue!

$ 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
like image 31
karakfa Avatar answered Oct 02 '22 18:10

karakfa