连接 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
组合输出中的第一行或所有非第一行的条件为真。
假设我有一个包含许多子目录的目录,每个子目录包含一些具有相同结构的 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
$ {
> 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
组合输出中的第一行或所有非第一行的条件为真。