Конкатенация файлов CSV в bash с сохранением заголовка только один раз - PullRequest
0 голосов
/ 14 ноября 2018

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

помечен как дубликат

Мне кажется, что это отличается от других вопросов, таких как , и , , в частности, потому что эти решения ссылаются на файл1 и файл2 в решении. Мой вопрос спрашивает о структуре каталогов с произвольным числом файлов, где я не хотел бы печатать каждый файл по одному.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать это find + xargs + awk:

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

NR==1 || FNR>1 условие будет истинно для самой первой строки в комбинированном выводе или для каждой не первой строки.

0 голосов
/ 14 ноября 2018
$ {
> cat real-daily-wages-in-pounds-engla.tsv;
> tail -n+2 real-daily-wages-in-pounds-engla.tsv;
> } | cat

Вы можете передать вывод нескольких команд через cat. tail -n+2 выделяет все строки в файле, кроме первой.

...