Odpowiedzi:
Potrzebujesz więcej niż cat
polecenia, jak opisano tutaj :
Załóżmy, że masz 3 pliki CSV: file1.csv
, file2.csv
, a file3.csv
i chcesz dołączyć je do bigfile.csv
a 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
tail -n+2
, tail +2
nie zadziałałoby
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.
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.
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
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ą sed
inkantację ...sed -ie "/^$/d;/^==>/d" bigfile.csv
Ł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.
awk 'FNR > 1' file*.csv > bigfile.csv
? To nie jest!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv