Конкатенация файлов CSV в bash с сохранением заголовка только один раз
Представьте, что у меня есть каталог, содержащий много подкаталогов, каждый из которых содержит некоторое количество 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 ответа
Вы можете использовать это find + xargs + awk
:
find . -name '*.csv' -print0 | xargs -0 awk 'NR==1 || FNR>1'
NR==1 || FNR>1
условие будет истинно для самой первой строки в комбинированном выводе или для каждой не первой строки.
$ {
> cat real-daily-wages-in-pounds-engla.tsv;
> tail -n+2 real-daily-wages-in-pounds-engla.tsv;
> } | cat
Вы можете передать вывод нескольких команд через cat
, tail -n+2
выделяет все строки из файла, кроме первой.