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?

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

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.


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.


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

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.