将许多文件合并为一个没有标题的文件

时间:2019-04-28 16:15:16

标签: bash unix

我有三个csv文件(具有相同的名称,例如A_bestInd.csv),它们位于不同的子文件夹中。我想将所有文件都复制到一个文件中(例如All_A_bestInd.csv)。为此,我执行了以下操作:

{ find . -type f -name A_bestInd.csv -exec cat '{}' \; ; } >> All_A_bestInd.csv

此命令的结果如下:

Class   Conf        1   2   3   4 //header of file1
A       Reduction   5   1   2   1
A       Reduction   1   8   1   10
Class   Conf        1   2   3   4 //header of file2
A       No_red      2   1   3   2
A       No_red      3   6   1   9
Class   Conf        1   2   3   4 //header of file3
A       Reduction   5   5   8   9
A       Reduction   7   2   1   11

如您所见,问题是每个文件的标题都被复制了。如何更改命令以仅保留一个标头并避免其余标头?

3 个答案:

答案 0 :(得分:1)

使用tail +2修剪所有文件的标题。

find . -type f -name A_bestInd.csv -exec tail +2 {} \; >> All_A_bestInd.csv

要仅保留一个标头,可以将其与head -1组合。

{ find . -type f -name A_bestInd.csv -exec head -1 {} \; -quit
  find . -type f -name A_bestInd.csv -exec tail +2 {} \; } >> All_A_bestInd.csv

答案 1 :(得分:0)

使用过滤掉除第一个文件外的所有文件的标题行:

find . -type f -name 'A_bestInd.csv' -exec awk 'NR==1 || FNR>1' {} + > 'All_A_bestInd.csv'

NR==1 || FNR>1表示;如果从输入开始的当前行数为1 ,或者从当前文件的开始的当前行数大于1 ,则打印当前行。


$ cat A_bestInd.csv 
Class   Conf        1   2   3   4 //header of file3
A       Reduction   5   5   8   9
A       Reduction   7   2   1   11
$ 
$ cat foo/A_bestInd.csv 
Class   Conf        1   2   3   4 //header of file1
A       Reduction   5   1   2   1
A       Reduction   1   8   1   10
$ 
$ cat bar/A_bestInd.csv 
Class   Conf        1   2   3   4 //header of file2
A       No_red      2   1   3   2
A       No_red      3   6   1   9
$ 
$ find . -type f -name 'A_bestInd.csv' -exec awk 'NR==1 || FNR>1' {} + > 'All_A_bestInd.csv'
$
$ cat All_A_bestInd.csv 
Class   Conf        1   2   3   4 //header of file1
A       Reduction   5   1   2   1
A       Reduction   1   8   1   10
A       Reduction   5   5   8   9
A       Reduction   7   2   1   11
A       No_red      2   1   3   2
A       No_red      3   6   1   9

答案 2 :(得分:0)

tail +2awk的解决方案,但是在我看来,打印除文件第一行以外的所有内容的经典方法是sed:sed -e 1d。所以:

find . -type f -name A_bestInd.csv -exec sed -e 1d '{}' \; >> All_A_bestInd.csv