Слияние нескольких файлов CSV без слияния заголовка


21

Мне нужно объединить несколько файлов .CSV (используя catкоманду), но без копирования заголовка для каждого файла.

Как лучше всего выполнить эту задачу?

Ответы:


32

Вам понадобится больше, чем catкоманда, как описано здесь :

Скажем , у вас есть 3 CSV-файлов: file1.csv, file2.csv, и file3.csvи хотите присоединиться к ним , чтобы bigfile.csvи ваш заголовок всегда (только) в первой строке, а затем использовать

либо (сохранить заголовок из первого файла "file1.csv"):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

или (удалить заголовок из всех файлов, имена которых начинаются с "file"):

awk 'FNR > 1' file*.csv > bigfile.csv

4
Я нашел это в поисках общего ответа Linux, но в моем случае это не совсем сработало. Это будет молча игнорировать file1.csv. Мне нужно было отследить этот файл. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Лелон

Я получаю tail + 2: команда не найдена, когда я использовал cat <file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv)> метод

@ user64636 должен быть пробел между хвостом и +2
nohillside

на самом деле я должен был использовать tail -n+2, tail +2не будет работать
Матье Наполи

12

Я согласен с верхним ответом, но предлагаю расширить его следующим сценарием (так как я не могу комментировать):

Если вы хотите, чтобы выходной файл содержал заголовок (один раз), правильный сценарий:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR представляет номер обработанной записи в одном файле. И NR представляет его глобально, поэтому первая строка принимается, а остальные игнорируются, как и раньше.


6

Вы также можете использовать групповую команду ( { ; }) вместо процесса substitution ( <()):

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

Он также работает с окончаниями строк CRLF, если файлы заканчиваются пустой строкой ( \r\n).

Только числовые версии головы и хвоста были устаревшими в POSIX 1003.1-2001, и в некоторых средах они вызывают предупреждения.


2

Необходимо объединить два больших CSV с одинаковыми столбцами в больший CSV для фрагментированного сценария (данные не имеют уникальных идентификаторов).

Первый взял заголовок из второго CSV

awk 'FNR > 1' file2.csv > file2_noheading.csv

Далее, объединены через следующее

cat file1.csv file2_noheading.csv > newfile.csv

1

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

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

Чтобы сделать его правильным CSV, с одной строкой заголовка и всеми соответствующими значениями, я использовал следующее sedзаклинание ...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

Простое решение, если у вас есть тонна файлов:

awk 'FNR > 1' *.csv > merged.csv

Просто вернитесь, чтобы отредактировать большой файл и добавить заголовок обратно.


Чем ваш ответ отличается от того, что было подготовлено iolsmit в 2013 году awk 'FNR > 1' file*.csv > bigfile.csv? Это не!
user3439894

Re: как это отличается? Это более краткий ответ и тот, который я скопировал и вставил, по крайней мере:) Получает мое возражение
Рик Дэвис

Это хороший ответ, потому что вам не нужно все файлы , чтобы начать сfile
big_smile
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.