Scalanie wielu plików CSV bez scalania nagłówka

21

Muszę scalić wiele plików .CSV (za pomocą catpolecenia), ale bez kopiowania nagłówka dla każdego pliku.

Jaki jest najlepszy sposób na wykonanie tego zadania?

Dranian
źródło

Odpowiedzi:

32

Potrzebujesz więcej niż catpolecenia, jak opisano tutaj :

Załóżmy, że masz 3 pliki CSV: file1.csv, file2.csv, a file3.csvi chcesz dołączyć je do bigfile.csva nagłówek jest zawsze (tylko) w pierwszej linii, a następnie użyć

albo (zachowaj nagłówek z pierwszego pliku „plik1.csv”):

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

lub (usuń nagłówek ze wszystkich plików, których nazwy zaczynają się od „plik”):

awk 'FNR > 1' file*.csv > bigfile.csv
iolsmit
źródło
4
Znalazłem to, szukając ogólnej odpowiedzi na Linux, ale w moim przypadku nie zadziałało to dokładnie. Po cichu zignoruje plik1.csv. Musiałem zakotwiczyć ten plik. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon,
Dostaję tail + 2: polecenie nie zostało znalezione, gdy użyłem metody cat <plik1.csv <(tail +2 plik2.csv) <(tail +2 file3.csv)> bigfile.csv
@ user64636 między ogonem a +2 powinna znajdować się spacja
nohillside
właściwie musiałem użyć tail -n+2, tail +2nie zadziałałoby
Matthieu Napoli
12

Zgadzam się z najlepszą odpowiedzią, ale proponuję ją rozszerzyć o następujący scenariusz (ponieważ nie mogę komentować):

Jeśli chcesz, aby plik wyjściowy zawierał nagłówek (jeden raz), poprawnym skryptem jest:

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

FNR reprezentuje liczbę przetworzonych rekordów w jednym pliku. NR reprezentuje to na całym świecie, więc pierwsza linia jest akceptowana, a pozostałe są ignorowane jak poprzednio.

Marek Grác
źródło
7

Możesz również użyć polecenia group ( { ; }) zamiast substytucji procesu ( <()):

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

Działa również z zakończeniami linii CRLF, o ile pliki kończą się pustą linią ( \r\n).

Numery tylko wersji głowy i ogona stały się przestarzałe przez POSIX 1003.1-2001 i powodują ostrzeżenia w niektórych środowiskach.

Lri
źródło
2

Konieczne było połączenie dwóch dużych plików CSV z identycznymi kolumnami w większym pliku CSV w celu utworzenia skryptu (dane nie mają unikalnych identyfikatorów).

Pierwszy wziął nagłówek z drugiego pliku csv

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

Następnie połączono za pomocą następujących elementów

cat file1.csv file2_noheading.csv > newfile.csv
McCellelljk
źródło
1

Użycie powyższej sekwencji poleceń spowodowało, że plik wyglądał tak:

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

contents,of,csv2

Aby był to właściwy plik CSV, z jedną linią nagłówka i wszystkimi odpowiednimi wartościami, zastosowałem następującą sedinkantację ...sed -ie "/^$/d;/^==>/d" bigfile.csv

hd1
źródło
0

Łatwiejsze rozwiązanie, jeśli masz mnóstwo plików:

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

Wystarczy wrócić do edycji dużego pliku i ponownie dodać nagłówek.

Brian
źródło
Czym różni się twoja odpowiedź od tego, co iolsmit przedstawił w 2013 roku awk 'FNR > 1' file*.csv > bigfile.csv? To nie jest!
user3439894
Re: jak to jest inaczej? To jest bardziej zwięzła odpowiedź, a przynajmniej ta, którą skopiowałem i wkleiłem, przynajmniej:) Dostaje moją opinię
Rick Davies
To dobra odpowiedź, ponieważ nie potrzebujesz wszystkich plików na początekfile
big_smile