按列组合多个文件,只使用第一列一次

时间:2014-07-07 10:56:20

标签: bash csv concatenation

我必须将许多类似的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

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

2 个答案:

答案 0 :(得分:1)

请勿使用输出覆盖您正在读取的文件。相反,将其重命名为中间名,让脚本从该文件中读取,然后输出到具有原始名称的文件。完成后删除输入文件。

或者,为输出文件选择一个中间名,写入所有输入,并且只有在处理完所有输入后,才能将输出文件重命名为最终名称。

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

答案 1 :(得分:1)

moreutils package中的sponge实用程序是我一直用于此类情况的内容:

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

sponge非常简单地“吸收”标准并写入您之后提供的文件名。它专门针对这种情况编写,以避免您需要创建(然后记住删除)临时文件。