2012-11-15 32 views
16

Büyük bir csv dosyam var (terabayt sırasına göre).csv dosyasına bir satır ekleyin

Şimdi, üst sıraya bir satır olan bir satır eklemek istiyorum. Örneğin

input.csv aşağıdaki gibiyse: Ben

id1,id2,id3,id4 
1,2,3,4 
and so on 

benzemek istiyorum

1,2,3,4 
22,3,23,1 

Nasıl kabuk, terminal, awk, bash yapıyorsun/

?

cevap

16

geçerli:

sed -i 1i"id1,id2,id3,id4" file.csv 

düzenleme: @Ed Morton işaret ettiği gibi

, -i anahtarı ile sed kullanarak sed dosyayı yerinde düzenler ve bu nedenle büyük dosyaları düzenlerken tehlikeli olabilir. -i seçeneğinden sonra bir önek sağlarsanız, sed bir yedek oluşturur. Yani böyle bir şey daha güvenli olacaktır:

sed -i.bak 1i"id1,id2,id3,id4" file.csv 

orijinal dosya daha sonra file.csv.bak

+0

Kesinlikle böyle büyük bir dosya ile bunu yapmazdım. sed, anında bir tmp dosyası oluşturuyor - eğer alanı bulmayı başaramazsa, orijinal dosyanızın içeriğini kaybettiyseniz şaşırmam. Sadece 'cmd dosyası> tmp && mv tmp dosyası' kullanın ve güvenli olduğunu biliyorsunuz. –

+0

@Ed: Haklısınız, bu, söz konusu olan gibi çok büyük dosyalar için özellikle güvenli değildir. Cevabımı hala sed kullanarak daha güvenli bir alternatif sağlamak için düzenledim. –

9

Bu kadar basit olarak:

{ echo "id1,id2,id3,id4"; cat file.csv; } > newfile.csv 
Basit kabuk birleştirmeyi kullanarak

.

DÜZENLEME aşağıda tartışma iplik, bu teklif

sonra:

  • sizin başlığıyla bir dosya oluşturmak head.txt

Sonra şunları söyledi:

cat head.txt file.csv > newfile.csv 
+0

Dosyanın tüm içeriğini "yankılamamak" için bir yol var mı? Bir sebepten dolayı dosyanın tüm içeriğini pritining ediyor ... ve gerçekten büyük dosya? – Fraz

+0

@Fraz: Bunu geçici bir dosya olmadan (cevabımda olduğu gibi) bile yapmanın kolay bir yolu yoktur. Sorun şu ki, fiziksel olarak dosyanızdaki tüm verileri 16 bayta indirmeniz gerekiyor. –

+0

oh .. tamam .. komutu bulunamadı bir hata alıyorum .. onun uzun bir sorgu .. yani burada {echo "mkey1, merchant_id, bayrak, varsayılan, E1, E2, E3, E4, E5, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, I1, I2, I4, I5, I6, I7 I8, i9, I10, I11, I12, I13, I14, I15, I16, ​​I17, I18, I19, I20, I21, I22, I23, I24, I25, I26, I27, I28, I29, I30, I31, I32, I33, I34, I35, I36, I37, I38, I39, I40, I41, I42, I43, I44, i46, I47, I48, I50, I51, I52, I53, I54, I55, I56, O1, O2, O3, O4, O5, O6, O7, O8, O9, benchmark_score, Julian, ağırlık " ; cat prepared_input.csv; }> mahout_input.csv – Fraz

1

Kolay bir yol yok, dosyayı yeniden yazmanız gerekecek. Muhtemelen en güvenli yolu sed kullanarak,

(echo "id1,id2,id3,id4" ; cat file) > newFile && rm file 

için IHTH

yerde
+2

Neden burada bir alt kabuk kullanıyorsunuz? –

+0

deneyimim, {....} etkin bir şekilde bir alt kabuğudur. Yani, diğerinin 1/5'i. İyi şanslar. – shellter

+2

Hayır, '()' bir alt kabuk iken {} 'bir yeniden gruptur. –

2

Edit yer alacaktır. Bu cevabı yazdığımda, sorunun "terabayt" bölümünü gözden kaçırdım. Bu nedenle, burada sunulan yöntem kullanmayın. Hala bu yazıyı bırakıyorum, çünkü bu harika aracın kullanımını, standart metin editörü olan ed.

Her zamanki gibi, ed standart metin editörüdür. sed -i kullanılarak yapılan çözüm, "dosyayı yerinde düzenleyin" ifadesinde bulunmuyor. Bunun yerine, içeriğini geçici bir dosyaya gönderir ve sonra bu dosyayı orijinal olana yeniden adlandırır. Bu büyük dosyalar için gerçekten iyi değil!

Bunun yerine ed kullanarak dosyayı gerçekten düzenler.Aşağıdaki doğrultuda bir şey:

#!/bin/bash 

file="input.csv" 

{ 
ed -s "$file" <<EOF 
1 
i 
id1,id2,id3,id4 
. 
wq 
EOF 
} > /dev/null 

Açıklama: 1, ilk satıra gider i ekleme moduna girer, o zaman id1,id2,id3,id4 sonra . Normal moda geri dönmek için yerleştirin ve wq yazıp çıkmak için.

Bu yöntemde, dosyayı gerçekten düzenlersiniz ve sed yönteminden iki kat daha hızlıdır. Ayrıca, ed "büyük dosya güvenli" olarak bilinir!

Bitti.

+0

Hiçbir tampon oluşturulmadığı doğru değil. 'ed' tüm dosyayı bir arabelleğe okur ve arabelleğe yazmadan önce orijinal dosyayı zaplayacaktır. Çok yavaş olacak ve güvenli değil. –

+0

Evet, bir dosyanın düzenlenmesi bu demektir :) –

+0

Eğer "Eğer geçici bir dosya oluşturulmadı, ** tampon yok **, hiçbir şey yok!" Diyerek OP'yi yanlış yönlendirmemelisiniz. –