bash - 按列组合多个文件,仅使用第一列一次

标签 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

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

最佳答案

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

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

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

关于bash - 按列组合多个文件,仅使用第一列一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608964/

相关文章:

javascript - 在 Node js 中使用 rm 进行扩展通配

python - 根据日期对 CSV 文件进行排序

linux - 如何用bash脚本替换字符串并写回结果

javascript - 如何组合静态值和动态值以获取现有字符串的值

awk - 如何在 END 之前检测 awk 中的最后一行?

linux - 有谁知道如何使用CURL下载 "fake"?

json - Bash/JQ 解析错误 : Expected separator between values at line 1, 第 254 列

node.js - 将标准输出转换为 JSON

excel - Matplotlib:直接从 .csv 导入并绘制带有图例的多个时间序列

mysql - SQL Concat 和 intvalue