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?

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

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.


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.


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

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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.