我有三个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
如您所见,问题是每个文件的标题都被复制了。如何更改命令以仅保留一个标头并避免其余标头?
答案 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)
使用awk过滤掉除第一个文件外的所有文件的标题行:
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 +2
和awk
的解决方案,但是在我看来,打印除文件第一行以外的所有内容的经典方法是sed:sed -e 1d
。所以:
find . -type f -name A_bestInd.csv -exec sed -e 1d '{}' \; >> All_A_bestInd.csv