【问题标题】:Merging files with the same header in different directories合并不同目录中具有相同标题的文件
【发布时间】:2020-12-16 12:12:08
【问题描述】:

我有这个文件夹结构,其中包含 300 多个文件夹,所有文件夹名称不同,但 csv 文件名相同:

some folder name > file_name.csv
some other folder name > file_name.csv
...
another folder name > file_name.csv

所有文件都有一个标题行,我正在尝试将所有文​​件合并到一个只有一个标题的文件中。

查看了具有类似问题的问题并已经到了这一点,但这不起作用,并且仍会在最终输出文件中多次输出标题。当我在同一个目录中拥有不同名称的所有文件时,awk 'NR == 1 || FNR > 1' *.csv >> $OUTPUT_LOCATION \; 可以工作。有人可以解释为什么当我的文件位于不同目录中时这不起作用并提出替代方案吗?

rm -f $OUTPUT_LOCATION

find . -name 'file_name.csv' \
  -exec awk 'NR == 1 || FNR > 1' {} >> $OUTPUT_LOCATION \;

【问题讨论】:

  • 那么所有文件的格式都一样吗?你能发布一个格式的例子吗?
  • 是的,格式相同,标题相同。标准 CSV 文件。
  • @oguzismail 有效! (在测试数据集上)你能解释一下为什么吗?什么时候文件太多?我有 340 个文件夹要遍历,总共要合并大约 31GB 的数据。
  • 如果您用分号标出-exec,则程序将为每个选定的文件执行一次。但是带有加号的程序每几千个文件运行一次。数量可能会有所不同,但始终是有限的

标签: bash find sh


【解决方案1】:

目前,您正在为 find 命令找到的每个文件执行 awk 命令。在现有命令中保留 NR 和 FNR 逻辑。将查找结果重定向回 awk 以处理多个文件等:

awk 'NR == 1 || FNR > 1' $(find . -name 'file_name.csv') >> $OUTPUT_LOCATION

【讨论】:

    【解决方案2】:

    来自方便的csvkit 实用程序包的csvstack 是为此而制作的:

    csvstack **/file_name.csv > joined.csv
    

    【讨论】:

      【解决方案3】:

      如果file_name.csvs 不多,将\; 更改为+ 会有所帮助。但为了以防万一,这里有一个故障安全方法:

      rm output.csv
      find . -name 'file_name.csv' -exec sh -c '
      if ! test -f output.csv; then
        cp "$1" output.csv
        shift
      fi
      tail -q -n +2 "$@" >>output.csv' sh {} +
      

      导出OUTPUT_LOCATION 并在必要时使用它来代替output.csv

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-18
        • 2017-09-12
        • 1970-01-01
        • 2021-06-15
        • 2016-03-20
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多