在bash中串联CSV文件,仅保留标头一次

时间:2018-11-14 19:13:32

标签: bash awk sed cat unix-head

想象一下,我有一个包含许多子目录的目录,每个子目录都包含一些具有相同结构的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

标记为重复

我觉得这与诸如thisthis之类的其他问题有所不同,特别是因为这些解决方案引用了解决方案中的file1和file2。我的问题询问一个目录结构,其中包含任意数量的文件,在这里我不想一一列出每个文件。

2 个答案:

答案 0 :(得分:6)

您可以使用此find + xargs + awk

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

NR==1 || FNR>1条件对于组合输出中的第一行或每个非第一行都成立。

答案 1 :(得分:0)

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

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