Üstbilgiyi birleştirmeden Birden Fazla CSV Dosyasını Birleştirme


21

( catKomut kullanarak ) birden çok .CSV dosyalarını birleştirmek gerekir, ancak her dosya için başlığı kopyalamadan.

Bu görevi gerçekleştirmenin en iyi yolu nedir?

Yanıtlar:


32

Buradacat açıklandığı gibi komuttan daha fazlasına ihtiyacınız olacak :

: Eğer 3 CSV dosyaları var ki file1.csv, file2.csvve file3.csvve bunları katılmak isteyen bigfile.csvve başlık her zaman (sadece) ilk satır, daha sonra kullanımıdır

ya (başlığı "file1.csv" adlı ilk dosyadan sakla):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

veya (adları "file" ile başlayan tüm dosyalardan başlığı kaldırın):

awk 'FNR > 1' file*.csv > bigfile.csv

4
Bunu genel bir linux cevabı ararken buldum, ama benim durumumda bu tam olarak işe yaramadı. Sessiz olarak file1.csv dosyasını yok sayar. O dosyaya ihtiyacım vardı. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon

Kuyruk + 2 alıyorum: cat <file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv)> bigfile.csv yöntemi kullanıldığında komut bulunamadı

@ user64636 kuyruk ve +2 arasında bir boşluk karakteri olmalıdır
nohillside

aslında kullanmak zorunda kaldım tail -n+2, tail +2işe yaramaz
Matthieu Napoli

12

En iyi yanıtı kabul ediyorum, ancak aşağıdaki senaryo ile genişletmenizi öneririm (yorum yapamadığım gibi):

Çıktı dosyasının üstbilgiyi (bir kez) içermesini istiyorsanız, doğru komut dosyası şöyledir:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR, tek bir dosyada işlenen kaydın sayısını temsil eder. NR küresel olarak temsil eder, bu nedenle ilk satır kabul edilir ve geri kalanı daha önce olduğu gibi göz ardı edilir.


7

{ ; }İşlem ikamesi ( <()) yerine bir grup komutu ( ) da kullanabilirsiniz :

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

Dosyalar boş bir satırla ( \r\n) bittiği sürece CRLF satır sonlarıyla da çalışır .

Baş ve kuyruğun sadece sayıdaki sürümleri POSIX 1003.1-2001 tarafından geçersiz hale getirildi ve bazı ortamlarda uyarılara neden oldu.


2

Aynı sütunlara sahip iki büyük CSV'yi parçalama komut dosyası için daha büyük CSV'ye birleştirmek gerekir (verilerin benzersiz kimlikleri yoktur).

İlk başlık ikinci csv'den çıktı

awk 'FNR > 1' file2.csv > file2_noheading.csv

Ardından, aşağıdakilerle birleştirildi

cat file1.csv file2_noheading.csv > newfile.csv

1

Yukarıdaki komut dizisini kullanmak şöyle bir dosyaya neden oldu:

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

Bir başlık satırı ve ilgili tüm değerlerle uygun bir CSV yapmak için aşağıdaki sedbüyüyü kullandım ...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

Tonlarca dosyanız varsa daha kolay çözüm:

awk 'FNR > 1' *.csv > merged.csv

Büyük dosyayı düzenlemek ve başlığı tekrar eklemek için geri dönmeniz yeterlidir.


Cevabınız, 2013 yılında iolsmit tarafından sunulan hazır olanlardan nasıl farklı awk 'FNR > 1' file*.csv > bigfile.csv? Değil!
user3439894

Re: nasıl farklı? Bu daha kısa bir cevap ve en azından kopyalayıp yapıştırdım:) Benim oyumu alır
Rick Davies

Bu iyi bir yanıttır, çünkü başlamak için tüm dosyalara ihtiyacınız yokturfile
big_smile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.