1

想象一下,我有一个包含许多子目录的目录,每个子目录都包含一些具有相同结构的 CSV 文件(相同的列数并且都包含相同的标题)。

我知道我可以从父文件夹运行类似

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

这可以正常工作,因为每次都重复标题(每个文件一次)。

我也知道我可以做类似的事情sed 1d <filename>tail -n +<N+1> <filename>跳过文件的第一行。

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

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

例如输入文件

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

每个文件都有标题的地方:

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

所需的输出将是:

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

标记为重复

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

4

2 回答 2

6

你可以使用这个find + xargs + awk

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

NR==1 || FNR>1对于组合输出中的第一行或每个非第一行,条件将为真。

于 2018-11-14T19:22:14.577 回答
0
$ {
> cat real-daily-wages-in-pounds-engla.tsv;
> tail -n+2 real-daily-wages-in-pounds-engla.tsv;
> } | cat

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

于 2018-11-14T19:21:46.200 回答