2016-03-24 26 views
0

göre, CSV veri içine fazladan değer katmaken i dosya adı biçimleri aşağıdaki türü var diyelim dosya

.... 
"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1 
"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3 
"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2 
"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8 
.......... 

Şimdi de bu .dat dosyaları tek bir çıkış .dat dosyaya birleştirebilirsiniz aşağıdaki .sh dosya var. ( )-parametresine göre 'standart' bir değere sahip olmak için değerlerin başlamasından önce her satırda CO#combined.dat'un içinde olmasını istiyorum. Örneğin her dosyanın ATH dosya adında her satırın başlangıcında 3, olması ve dosya adında MAR ile 22, olması gerekir.

.... 
3,"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1 
3,"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3 
20,"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2 
20,"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8 
.......... 

Yani sonuç olarak ben komut yukarıdaki prosedürü yapmak istiyorum:

Yani CO#combined.dat böyle bir şey olmalı!

Şimdiden teşekkürler!

cevap

2

awk ile dahili bir FILENAME değişkeninden yararlanarak belirli bir çağrıya birden fazla dosya sağlayabildiğinizden yararlanabilirsiniz. awk, sırayla her bir dosyayı işler ve FILENAME değerini, kayıtları okunmakta olan dosyanın adına ayarlar.

Bununla birlikte, ön ekinizi dosya adında aramak istediğiniz herhangi bir desene göre ayarlayabilirsiniz. Son olarak öneki ve orijinal kaydı yazdırabilirsiniz.

$ cat CO\#ATH2000.dat 
1 
2 
3 

$ cat CO\#MAR2000.dat 
A 
B 
C 

$ awk 'FILENAME ~ /MAR/ {pre=22} FILENAME ~ /ATH/ {pre=3} { print pre "," $0 }' CO*.dat 
3,1 
3,2 
3,3 
22,A 
22,B 
22,C 
+0

Bu kod soruyu yanıtlayabilirken, bazı _context_ öğelerini eklemek daha iyi olurdu, _how_ çalışıyor ve _when_ bunu kullanmak için. Sadece kod cevapları uzun vadede yararlı değildir. –

+1

@BenjaminW., Güncellendi. – jas

+0

Bir çekicilik gibi çalışır! :) Teşekkür ederim! – Diaman

1

basitçe

for f in CO#*; do 
     case ${f:3:3} in 
      ATH) k=3 ;; 
      *) k=22 ;; 
     esac; 
     sed "s/^/$k,/" $f >> all; 
done 

$ yapılabilir: Burada

sizin örnek girişinin basitleştirilmiş sürümlerinde bir gösteri var {f: 3: 3} dosya kod ATH veya MAR ayıklamak bu bash substring işlevi; durumda kod, sayısal karşılığa dönüştürür; her satırın başlangıcında sayısal değeri ve virgül ekleyin.

+0

Çok hoş. Ben şunu yazarım: '' ATH * 'deki dava $ f' '. –

+1

@sarriman, karakfa'nın tasvir ettiği gibi, ls' üzerinde yineleme yapmamanız gerektiğini unutmayın - http://mywiki.wooledge.org/ParsingLs –

+0

Tamamen bu kodun ne olduğunu anlayamıyorum. $ {f: 3: 3} 'yapar ...? ve ayrıca ne yapar? – Diaman