Объединить много файлов в один файл без заголовка - PullRequest
3 голосов
/ 28 апреля 2019

У меня есть три 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 ]

1 голос
/ 28 апреля 2019

Используйте 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
0 голосов
/ 30 апреля 2019

Существуют решения с tail +2 и awk, но мне кажется, что классический способ печати всех, кроме первой строки файла - sed: sed -e 1d. Итак:

find . -type f -name A_bestInd.csv -exec sed -e 1d '{}' \; >> All_A_bestInd.csv
0 голосов
/ 28 апреля 2019

Используйте , чтобы отфильтровать строки заголовка для всех файлов, кроме первого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...