Yanıtlar:
Buradacat
açıklandığı gibi komuttan daha fazlasına ihtiyacınız olacak :
: Eğer 3 CSV dosyaları var ki file1.csv
, file2.csv
ve file3.csv
ve bunları katılmak isteyen bigfile.csv
ve 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
tail -n+2
, tail +2
işe yaramaz
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.
{ ; }
İş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.
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
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.
awk 'FNR > 1' file*.csv > bigfile.csv
? Değil!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv