【问题标题】:Combining many files columnwise, use first column only once按列组合许多文件,仅使用第一列一次
【发布时间】:2014-08-27 20:08:44
【问题描述】:

我必须将许多类似的 csv 文件合并到一个文件中。它们存储在许多不同的子目录中,但单个 csv 文件具有相同的名称。

我需要按列附加它们,但我只需要第一个“名称”列一次。所以我想保留第一个 csv 文件的第一列并将它们从所有后续文件中删除。参考this question 我尝试了以下命令:迭代所有子目录,而最终文件位于主目录中(并且在开始时是许多 csv 文件之一的副本,因此它已经包含“名称”列):

for i in */; do paste final_table.csv <(cut -f 2- "$i"single_table.csv) > final_table.csv ; done

但是,当输入文件之一也是输出文件时,粘贴似乎不起作用。 我该如何正确解决这个问题?

【问题讨论】:

    标签: bash csv concatenation


    【解决方案1】:

    不要用输出覆盖您正在读取输入的文件。相反,将其 mv/rename 为中间名称,让您的脚本从该文件中读取,并输出到具有原始名称的文件。完成后删除输入文件。

    或者,为输出文件选择一个中间名称,将所有输入写入其中,只有在处理完所有输入后,mv/rename 输出文件为最终名称。

    作为中间名称,附加一个临时文件名结尾(“扩展名”)可能很有用。

    【讨论】:

    • for i in */; do paste final_table.csv &lt;(cut -f 2- "$i"single_table.csv) &gt; final_table_intermediate.csv; mv final_table_intermediate.csv final_table.csv ; done 似乎有效!非常感谢!
    【解决方案2】:

    moreutils package 中的 sponge 实用程序是我经常用于这种情况的工具:

    for i in */; do
      paste final_table.csv <(cut -f 2- "$i"single_table.csv) | sponge final_table.csv
    done
    

    sponge 很简单地“吸收”标准并写入您之后给它的文件名。它是专门为此类情况编写的,以避免您需要创建(然后记得删除)临时文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多