在Bash中附加到同一行

时间:2016-11-05 01:46:23

标签: bash list csv sed append

letters.csv文件包含:

b,a,c,

文件numbers.csv包含:

32
34
25
13

我想将numbers.csv附加到letters.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

我希望所有条目都在同一条线上。怎么办呢?

4 个答案:

答案 0 :(得分:7)

您可以单独使用paste

首先,将numbers.csv中的内容转换为逗号分隔值。 -s是串行选项,-d,将逗号指定为分隔符:

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

然后通过指定空分隔符和process substitution将此输出附加到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


要修改OP中发布的sed命令,请使用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

答案 1 :(得分:5)

您可以使用tr

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

(我希望这不是对cat的无用的使用。: - ))

最后sed需要用换行符替换最后,

答案 2 :(得分: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

答案 3 :(得分:2)

awk 'FNR==NR{t=$0;next}{s=s","$0}END{print t s}' letters.csv numbers.csv