在unix,bash中合并csv文件

时间:2013-07-24 11:50:14

标签: bash csv unix merge

我有一些格式如下的csv文件:

test1.csv:

    field,port1
    a1,0.2
    a2,0.3
    a3,0.6

test2.csv:

field,port2
b1,0.5
b2,0.6
b3,0.7
b4,0.1
b5,0.5

test3.csv:

field, port3
c1,0.1
c2,0.4

依此类推。我想将这些csv合并为一个,所以它看起来像:

field,port1,field,port2,field,port3
a1,0.2,b1,0.5,c1,0.1
a2,0.3,b2,0.6,c2,0.4
a3,0.6,b3,0.7,,
,,b4,0.1,,
,,b5,0.5,,

我该怎么做?我猫>>但这只会是前两列中的所有内容。如果必须的话,我可以这样做,但这样的合并可以让我的生活变得更简单。

由于

2 个答案:

答案 0 :(得分:4)

paste可以做类似的事情:

$ paste -d, test[1-3].csv
field,port1,field,port2,field, port3
a1,0.2,b1,0.5,c1,0.1
a2,0.3,b2,0.6,c2,0.4
a3,0.6,b3,0.7,
,b4,0.1,
,b5,0.5,

请注意,-d,代表分隔符为逗号。

答案 1 :(得分:1)

以fedorqui的回答为基础:

paste -d: test[1-3].csv | sed -e's/^:/,:/' -e's/::/:,:/g' -e's/::/:,:/g' -e's/:$/:,/' -e's/:/,/g'

(假设您的文件中没有: - 但您可以选择另一个临时分隔符)

这会恢复您期望的所有逗号。需要这对相同的替换指令,因为替换字符串不会被考虑用于另一个替换。

一般来说:

paste -d'T' file... | sed -e's/^T/ET/' -e's/TT/TET/g' -e's/TT/TET/g' -e's/T$/TE/' -e's/T/S/g'

其中T是临时分隔符(上面为:),E是应替换空行或缺失行(上面为,)的字符串,S 1}}是paste d个文件(,上面的行)之间的分隔符。临时分隔符T(通用字符串)不得出现在文件和E中,而最终分隔符S可以。{/ p>

警告:以上命令可能在shell中引用的字符串之前需要空格