Bir CSV dosyasına bir sütunu bırakmak için bir komut satırı büyüsü var mı?


32

Aşağıdaki içeriklerden bir dosyaya sahip olmak:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

Orijinaline eşit bir dosya almaya çalışıyorum ancak n = 2 gibi bir n. Sütundan yoksunum (yoksa 3 olabilir)

1111,2222,4444
aaaa,bbbb,dddd

veya, n = 0 için (veya 1 olabilir)

2222,3333,4444
bbbb,cccc,dddd

Gerçek bir dosya, on binlerce sütuna sahip uzun gigabayt olabilir.

Her zaman olduğu gibi, sihirbazların sihirbazın zarif bir çözüm sunabileceğinden şüpheliyim ... :-)

Gerçek durumumda, ilk sütunu bir sırayla iki kez bırakarak yapılabilecek 2 ilk sütunu bırakmam gerekiyor, ama biraz genelleştirmenin daha ilginç olacağını düşünüyorum.


Alanların içermediği garantili ,mi? (Yani, ,yalnızca hiç alan ayırıcı olarak kullanılır.)
bir CVn

@ MichaelKjörling, daha esnek bir çözüme sahip olmak güzel olurdu, ama benim durumumda - evet: ayırıcı , ve bir alan içinde asla oluşmuyor.
Ivan

Bu durumda, Scott'ın cevabı sadece bir şey olmalı.
12'de CVn

Yanıtlar:


47

Bunun GNU çekirdeklerinin kesilmesi için spesifik olduğuna inanıyorum:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

Normal olarak -f üzerinden istediğiniz alanları belirtirsiniz, ancak --complement ekleyerek anlamı doğal olarak tersine çevirirsiniz. 'Adam kesiğinden':

--complement
    complement the set of selected bytes, characters or fields

Bir uyarı: sütunlardan herhangi biri virgül içeriyorsa, kesme işlemi bir elektronik tablonun yaptığı gibi bir CSV ayrıştırıcısı olmadığı için kesilir. Birçok ortak, CSV’de kaçan virgüllerin nasıl kullanılacağı konusunda farklı fikirlere sahiptir. CSV'nin basit hali için, komut satırında kesim hala geçerli olan yoldur.


4
Basit bir CSV dosyası olduğu sürece iyi çalışıyor. Sütunlardan herhangi biri, içinde virgül bulunan bir dize ise, cutCSV ayrıştırıcısı olmadığı için atar . Bir CSV alanının değerinde bir alan ayırıcı varsa, tırnak işaretleri içine alınır. Btw, konusunda cut, -fsaha aralıkları sürer. cut -f, -d3-ilk ikisini kaldırarak üçüncü alanı açacaktır.
Alexios

2
Yanicut -d, -f3-
işe yaramaz

@Alexios bu iyi bir nokta. Asla "gerçek" CSV ile uğraşmadım, sadece basit altküme. Bunu yansıtmak için cevabımı düzenleyeceğim.
Scott McClung

@ Yararsız: Kahretsin, evet. Buna benim "kesik disleksi" diyorum. nefes . Scott: CSV dosyaları zor canavarlardır. Hatta olmayan bazıları Çok fazla sayıda farklı alt biçimleri, C SV, ama geleneksel olarak bunu zaten denir.
Alexios

Bu, yeni CSV'yi terminalime yazdırıyor - girişin üzerine yazmasını nasıl sağlayabilirim (veya belki de yeni bir dosyaya yazabilirim, OP'nin de aradığı gibi görünüyor)?
Max Ghenis

12

Veriler yalnızca virgülle ayrılmış sütunlardan yapılmışsa:

cut -d , -f 1-2,4-

Ayrıca awk kullanabilirsiniz, ancak biraz gariptir çünkü bir alanı temizlemek kolaydır, ayırıcıyı çıkarmak biraz çalışma gerektirir. Boş alanınız yoksa, fena değil:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

Gerçek bir CSV'niz varsa, doğru şekilde alıntı yapıldığında, virgüllerin içinde alanlar içinde görünebilirse, gerçek bir CSV kitaplığına ihtiyacınız vardır .

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.