Jawaban:
Anda akan membutuhkan lebih dari cat
perintah, seperti dijelaskan di sini :
Katakanlah Anda memiliki 3 file CSV: file1.csv
,, file2.csv
dan file3.csv
dan ingin bergabung dengannya bigfile.csv
dan tajuk Anda selalu (hanya) baris pertama, lalu gunakan
baik (menjaga tajuk dari file pertama "file1.csv"):
cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
atau (hapus tajuk dari semua file yang namanya dimulai dengan "file"):
awk 'FNR > 1' file*.csv > bigfile.csv
tail -n+2
, tail +2
tidak akan berhasil
Saya setuju dengan jawaban teratas tetapi saya menyarankan untuk memperpanjangnya dengan skenario berikut (karena saya tidak bisa berkomentar):
Jika Anda ingin file output mengandung header (sekali) skrip yang benar adalah:
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR mewakili jumlah catatan yang diproses dalam satu file. Dan NR mewakilinya secara global, jadi baris pertama diterima dan sisanya diabaikan seperti sebelumnya.
Anda juga bisa menggunakan perintah grup ( { ; }
) alih-alih proses substitusi ( <()
):
{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv
Ia juga bekerja dengan ujung garis CRLF selama file berakhir dengan garis kosong ( \r\n
).
Versi hanya kepala dan ekor dibuat usang oleh POSIX 1003.1-2001, dan itu menghasilkan peringatan di beberapa lingkungan.
Diperlukan untuk menggabungkan dua CSV besar dengan kolom identik ke dalam CSV yang lebih besar untuk skrip chunking (data tidak memiliki id unik).
Pertama mengambil header dari csv kedua
awk 'FNR > 1' file2.csv > file2_noheading.csv
Selanjutnya, disatukan melalui berikut ini
cat file1.csv file2_noheading.csv > newfile.csv
Menggunakan urutan perintah di atas menghasilkan file yang tampak seperti ini:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Untuk menjadikannya CSV yang tepat, dengan satu baris tajuk dan semua nilai yang relevan, saya menggunakan sed
mantra berikut ...sed -ie "/^$/d;/^==>/d" bigfile.csv
Solusi yang lebih mudah jika Anda memiliki banyak file:
awk 'FNR > 1' *.csv > merged.csv
Cukup kembali untuk mengedit file besar dan tambahkan kembali header.
awk 'FNR > 1' file*.csv > bigfile.csv
? Ini bukan!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv