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

21

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

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

Dranian
источник

Ответы:

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
iolsmit
источник
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, и в некоторых средах они вызывают предупреждения.

LRI
источник
2

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

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

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

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

cat file1.csv file2_noheading.csv > newfile.csv
mcconnelljk
источник
1

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

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

contents,of,csv2

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

hd1
источник
0

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

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

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

Брайан
источник
Чем ваш ответ отличается от того, что было подготовлено iolsmit в 2013 году awk 'FNR > 1' file*.csv > bigfile.csv? Это не!
user3439894
Re: как это отличается? Это более краткий ответ и тот, который я скопировал и вставил, по крайней мере:) Получает мое возражение
Рик Дэвис
Это хороший ответ, потому что вам не нужно все файлы , чтобы начать сfile
big_smile