2009-03-12 20 views
8

Bazı verileri temizlemeye çalışıyorum ve sonunda bunu CSV formuna koymak istiyorum.Bir dosyada ilk n satıra nasıl katılırım

Temizlemek için bazı normal ifadeler kullandım, ancak bir adımda takılıyorum.

Tüm üçüncü satırların tümünü (\ n) virgülle değiştirmek istiyorum.

veri şuna benzer:

field1 
field2 
field3 
field1 
field2 
field3 

vb ..

Bunu kullanarak sed veya awk yapmak için basit bir yol var

field1,field2,field3 
field1,field2,field3 

Herkes ihtiyaç? Bir program yazabilirim ve her 1 ve 2 yeni satır karakterini silmek için mod sayacı olan bir döngü kullanabilirim, ancak mümkünse komut satırından yapmayı tercih ederim. awk ile

cevap

7

:

awk '{n2=n1;n1=n;n=$0;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt 

Bu komut son üç satırı kaydeder ve her üçüncü satırında yazdırabilirsiniz. Ne yazık ki, bu sadece 3 satırlık birden fazla dosya ile çalışır.

daha genel bir komut dosyası: satır numarası 'de 3 bir katı değil zaman bu durumda

awk '{l=l$0;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt 

, son üç hat takılı virgül ayırıcı ile, tek bir dizge içinde birleştirilmiş Dosyanın sonuna, dize, kaldırılan son virgülle boş değilse yazdırılır.

1

kedi dosyası | perl -ne 'chomp(); $ _ yazdırın! (++ $ i% 3)? "\ n": ","; '

5

Awk sürümü:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}' 
biraz daha kısa ve bu 3 satırlık bir katını yok dosyalarını işleme var
4

A Perl çözümü:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt 
+0

İyi bir. Benimkinin işe yaramadığını biliyordum ama 3 dakika içinde çözümü görmedim. – jj33

0

vim sürümü:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g 
1

Kullanım nawk veya /usr/xpg4/bin/awk Solaris tarih:

awk 'ORS=NR%3?OFS:RS' OFS=, infile 
0

awk '{ORS = NR% 3 " ":?" \ n"; print}'

Bu sizin için işe yarayabilecek
1

urdata.txt:

paste -sd',,\n' file 

veya bu: olmayan mulitple-of-üç dosyalar üzerinde

sed '$!N;$!N;y/\n/,/' file