Menggabungkan Beberapa File CSV tanpa menggabungkan header

20

Saya perlu menggabungkan beberapa file .CSV (menggunakan catperintah) tetapi tanpa menyalin header untuk setiap file.

Apa cara terbaik untuk menyelesaikan tugas ini?

Dranian
sumber

Jawaban:

32

Anda akan membutuhkan lebih dari catperintah, seperti dijelaskan di sini :

Katakanlah Anda memiliki 3 file CSV: file1.csv,, file2.csvdan file3.csvdan ingin bergabung dengannya bigfile.csvdan 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
iolsmit
sumber
4
Saya menemukan ini mencari jawaban linux generik, tetapi dalam kasus saya ini tidak berfungsi. Diam-diam akan mengabaikan file1.csv. Saya perlu menyimpan file itu. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon
Saya mendapatkan ekor + 2: perintah tidak ditemukan ketika saya menggunakan cat <file1.csv <(ekor +2 file2.csv) <(ekor +2 file3.csv)> metode
@ user64636 harus ada karakter spasi antara ekor dan +2
nohillside
sebenarnya saya harus menggunakan tail -n+2, tail +2tidak akan berhasil
Matthieu Napoli
11

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.

Marek Grác
sumber
6

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.

Lri
sumber
2

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
mcconnelljk
sumber
1

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 sedmantra berikut ...sed -ie "/^$/d;/^==>/d" bigfile.csv

hd1
sumber
0

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.

brian
sumber
Bagaimana jawaban Anda berbeda dari apa yang sudah disiapkan oleh iolsmit pada tahun 2013 awk 'FNR > 1' file*.csv > bigfile.csv? Ini bukan!
user3439894
Re: bagaimana bedanya? Ini adalah jawaban yang lebih singkat dan yang saya salin dan tempel, setidaknya:) Mendapat jawaban positif saya
Rick Davies
Ini adalah jawaban yang bagus, karena Anda tidak memerlukan semua file untuk memulaifile
big_smile