【问题标题】:Using sed to combine multiple csv files使用sed合并多个csv文件
【发布时间】:2011-04-06 15:15:38
【问题描述】:

我想合并 3 个 csv 文件。每个文件有 3 个逗号分隔的列。

File 1 has columns a,b,c
File 2 has columns d,e,f
File 3 has columns g,h,i

我想将这 3 个文件合并为一个文件:

a,b,c,e,f,h

我可以使用 sed 来做到这一点吗?

我可以很容易地编写控制台应用程序或脚本,但我正在尝试获得一些 sed 技能并认为这应该是一项合适的任务?

【问题讨论】:

  • 您的合并标准是什么?为什么省略 "d","g","i" ?
  • 您是否需要加入某些列(所以也许 a = d)?如果是这样,那么您需要查看join 命令(Unix 世界中比较奇怪的命令之一)。请记住,数据需要按排序顺序排列,并决定如果其中一个文件中没有匹配值(DBMS 用语中的外连接)中的匹配值该怎么做。否则,如果它是纯粹的位置(文件 1 中的第 1 行与文件 2 中的第 1 行和文件 3 中的第 1 行),那么下面显示的粘贴和剪切命令是好的。使用“sed”很难(充其量);它一次处理一个文件,而不是并行处理 3 个。

标签: bash csv sed


【解决方案1】:

你可以这样做:

paste file[123] | sed 's/\t/,/g' | cut -d',' -f 1,2,3,5,6,8

【讨论】:

    【解决方案2】:

    或者只是剪切和粘贴:

    paste -d ',' file[123] | cut -d ',' -f 1,2,3,5,6,8
    

    【讨论】:

    • 谢谢!对称很漂亮:)
    • +1 - 但请注意,如果在任何数据字段中嵌入了逗号,那么一切都会崩溃。
    • PS:您会发现CSVFIX 可以处理粘贴在一起的文件,即使字段中有嵌入的逗号。
    • 这是一些不错的代码功夫!关于如何在 3 和 6 字段之后摆脱行尾字符的任何提示?他们正在破坏 excel 导入。
    【解决方案3】:

    Mat Mendel 的回答很好,除非您碰巧在使用 cygwin 的 Windows 上,在这种情况下,一些令人讨厌的行尾字符怪癖会发挥作用。这取决于 unix 命令实用程序,在这种情况下粘贴和剪切,使用 \n 作为行尾字符而不是 Windows 想要的 \r\n。

    我无法快速解决如何更改这些 utils 或 cygwin 的行尾字符,所以我很高兴能够使用 sed。

    paste -d ',' file1 file2 file3 | sed 's/\r//g' | cut -d ',' -f 1,2,3,5,6,8 | sed 's/$/\r/'
    

    【讨论】:

    • 啊,是的,额外的 '\r' 问题。很高兴看到你解决了!您可以使用 tr -d '\r',而不是第一个 sed 命令。不要误会我的意思,sed 很棒,但对于某些任务来说有点重。 :)
    • 问题换行是在中间还是在末尾?你也可以使用 dos2unix 或 unix2dos 来纠正它。
    猜你喜欢
    • 2015-02-20
    • 2013-08-02
    • 2013-02-11
    • 2015-06-19
    • 2013-07-19
    • 1970-01-01
    • 2012-11-16
    • 2015-05-05
    相关资源
    最近更新 更多