想象一下,我有一个包含许多子目录的目录,每个子目录都包含一些具有相同结构的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
我觉得这与诸如this和this之类的其他问题有所不同,特别是因为这些解决方案引用了解决方案中的file1和file2。我的问题询问一个目录结构,其中包含任意数量的文件,在这里我不想一一列出每个文件。
答案 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
从文件中选择除第一行以外的所有行。