连接 bash 中的 CSV 文件仅保留 header 一次

Concatenating CSV files in bash preserving the header only once

假设我有一个包含许多子目录的目录,每个子目录包含一些具有相同结构的 CSV 文件(相同数量的列并且所有包含相同的 header)。

我知道我可以从 parent 文件夹中 运行

find ./ -name '*.csv' -exec cat {} \; > ~/Desktop/result.csv

这会很好地工作,因为 header 每次都会重复(每个文件一次)。

我也知道我可以执行 sed 1d <filename>tail -n +<N+1> <filename> 之类的操作来跳过文件的第一行。

但就我而言,它似乎更专业一些。我想为第一个文件保留一次 header,然后为之后的每个文件跳过 header。

是否有人知道使用标准 Unix 工具(如 find、head、tail、sed、awk 等)和 bash 来实现此目的的方法?

例如输入文件

   /folder1
            /file1.csv
            /file2.csv
   /folder2
            /file1.csv

其中每个文件有 header:

A,B,C 并且每个文件有一个数据行 1,2,3

所需的输出为:

A,B,C
1,2,3
1,2,3
1,2,3

标记为重复

我觉得这与 this and 等其他问题不同,特别是因为这些解决方案在解决方案中引用了 file1 和 file2。我的问题是关于一个包含任意数量文件的目录结构,我不想一个一个地输入每个文件。

$ {
> cat real-daily-wages-in-pounds-engla.tsv;
> tail -n+2 real-daily-wages-in-pounds-engla.tsv;
> } | cat

您可以通过 cat 管道传输多个命令的输出。 tail -n+2 从文件中选择所有行,第一行除外。

您可以使用这个 find + xargs + awk:

find . -name '*.csv' -print0 | xargs -0 awk 'NR==1 || FNR>1'

NR==1 || FNR>1 组合输出中的第一行或所有非第一行的条件为真。