Об’єднання декількох файлів 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

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

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
Лелон

Я отримую хвіст + 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 представляє це у всьому світі, тому перший рядок приймається, а решта ігнорується, як і раніше.


7

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

{ 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? Це не!
користувач3439894

Re: як це все інакше? Це більш лаконічна відповідь і одна, яку я скопіював і вставив, принаймні:) Отримає своє оновлення
Рік Девіс

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