在 unix、bash 中合并 csv 文件

Posted

技术标签:

【中文标题】在 unix、bash 中合并 csv 文件【英文标题】:merge csv files in unix, bash 【发布时间】:2013-07-23 21:07:42 【问题描述】:

我有一些格式如下的 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,,

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

谢谢

【问题讨论】:

【参考方案1】:

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, 代表分隔符是逗号。

【讨论】:

嗯不知道有粘贴命令。这让事情变得更容易。 是的,我失去了逗号和顺序变化 @glennjackman 这还不够:它不能解决两个较长文件之间存在较短文件的情况。请参阅我的解决方案答案【参考方案2】:

基于 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 是行之间的分隔符pasted 文件(上面的,)。临时分隔符T(通用字符串)不能出现在文件和E中,而最终分隔符S可以。

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

【讨论】:

我收到一个错误 sed: Unrecognized command: -es/::/:,:/g。你能帮忙吗? @yatici:尝试在 -e 之后添加一个空格(这不是必需的,因为单引号,在 bash 中,但在其他 shell 中可能是必需的) 是的,它似乎有效。我也在 bash 上。也许只是一个不同的版本问题。 @yatici,我已经尝试过 bash 4.1.5 和 bash 4.1.10,不需要空间 - 有趣

以上是关于在 unix、bash 中合并 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BASH 中合并来自两个 CSV 文件的数据?

如何在unix中合并和删除文件?

用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本

使用 bash 将 .txt 文件连接成 .csv

将 csv 文件与 pandas 连接时内存不足

bash将csv尾部的纪元时间转换为人类可读