合并不同目录中具有相同 header 的文件

Merging files with the same header in different directories

我的文件夹结构有 300 多个文件夹,它们的名称各不相同,但都具有相同的 csv 文件名:

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

所有文件都有一个 header 行,我正在尝试将所有文​​件合并到一个只有一个 header.

的文件中

环顾了具有类似问题的问题并已达到这一点,但这不起作用并且仍会在最终输出文件中多次输出 header。当我将所有文件放在同一目录中但名称不同时,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 \;

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

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

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

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

csvstack **/file_name.csv > joined.csv

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

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