Ответы:
Вам понадобится больше, чем 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
tail -n+2
, tail +2
не будет работать
Я согласен с верхним ответом, но предлагаю расширить его следующим сценарием (так как я не могу комментировать):
Если вы хотите, чтобы выходной файл содержал заголовок (один раз), правильный сценарий:
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR представляет номер обработанной записи в одном файле. И NR представляет его глобально, поэтому первая строка принимается, а остальные игнорируются, как и раньше.
Вы также можете использовать групповую команду ( { ; }
) вместо процесса 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, и в некоторых средах они вызывают предупреждения.
Необходимо объединить два больших CSV с одинаковыми столбцами в больший CSV для фрагментированного сценария (данные не имеют уникальных идентификаторов).
Первый взял заголовок из второго CSV
awk 'FNR > 1' file2.csv > file2_noheading.csv
Далее, объединены через следующее
cat file1.csv file2_noheading.csv > newfile.csv
Используя приведенную выше последовательность команд, вы получили файл, который выглядит примерно так:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Чтобы сделать его правильным CSV, с одной строкой заголовка и всеми соответствующими значениями, я использовал следующее sed
заклинание ...sed -ie "/^$/d;/^==>/d" bigfile.csv
Простое решение, если у вас есть тонна файлов:
awk 'FNR > 1' *.csv > merged.csv
Просто вернитесь, чтобы отредактировать большой файл и добавить заголовок обратно.
awk 'FNR > 1' file*.csv > bigfile.csv
? Это не!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv