2012-04-04 57 views
5

ben fazla işlemben bir süre çalışıyorum

için uygun hale getirmek için çiğnemek gerek komut çıkışı bugüne kadar bir başarı ile bunu atlatmanın vb burada sed awk, yaklaşık şaşkınım

Ben metindir: Benim ihtiyacım yalnızca sayıları ayıklamak etmektir

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 

1/2 [3] 4/5 yüzden görünecektir:

1 2 3 4 5 

Yani, temelde ben tüm karakterleri hariç tutmaya çalışıyor "/", "[", "]", vb. gibi rakamlar değil. FS ile awk denedim, regexp kullanarak denedim, ancak hiçbiri başarılı olmadı. 1 saniye: 2 Üçüncü:

O zaman ilk gibi ona bir şey eklemek istiyorum 3 .... vs ben çok içeren bir dosya bahsediyorum akılda alınız eğer aynı yapıya sahip çizgiler, ama zaten "()"

awk '{sum1+=$1 ; sum2+=$2 ;......etc} END {print "first:"sum1 " second:"sum2.....etc}' 

her sütun toplamak awk kullanarak ama önce sadece ilgili sayılar, arasında olduğu tarih ayıklamak gerekir konusunda tamamen atlanabilir gerçi ama sayılardır Ayrıca, sadece rakamlarla filtrelemek de onları eşleştirecek kadar yeterli olmayacaktır.

Bana yardımcı olabilir umut Teşekkür peşin!

cevap

5

Bu: sed -r 's/[(][^)]*[)]/ /g; s/[^0-9]+/ /g' çalışmalıdır. Önceden parantez içine alınmış ifadeleri kaldırarak ve daha sonra tüm basamak olmayan sayıları tek boşluklarla değiştirerek iki geçiş yapar.

+0

BÜYÜK! tam olarak ihtiyacım olan şey! '10/20 [30] (tarih) kelimesi kelimesi kelimesi kelimesi 40/50 10/20 [30] (tarih) kelimesi kelimesi kelimesi kelimesi 40/50: İşte tüm komut içeren sınama.txt dosyayı nasıl göründüğü Yani, çalışırken: 'cat test.txt | sed -r '/ [(] [^)] * [)]// g; s/[^ 0-9] +// g '| awk '{sum1 + = 1 $; sum2 + = $ 2; sum3 + = $ 3; sum4 + = $ 4; sum5 + = 5 $} END {print "first:" sum1, "second:" sum2, "üçüncü:" sum3, "dördüncü:" sum4 ", beşinci:" sum5 "' ve çıktısı: ' ilk: 20 saniye : 40 üçüncü: 60 dördüncü: 80 beşinci: 100' Çok teşekkürler @ Michał Kosmulski Siz harikasınız – TuxSax

+0

BTW, yorumların cevaplar ve sorular gibi daha iyi görünmesi için bir yol var mı? Kod blokları ve girinti, satır sonları vb. Gibi. – TuxSax

+0

Bir şey değil. Biçimlendirmeye gelince, şu sayfaya bakın: http://stackoverflow.com/editing-help#comment-formatting –

2

sed -e 's/(.*)//' -e 's/[^0-9]/ /g' gibi bir şey yapabilirsiniz. Tüm köşeli olmayan karakterleri boşlukla değiştirmekten ziyade, yuvarlak köşeli parantez içindeki her şeyi siler. fazladan boşluklar kurtulmak için, column -t onu besleyebilir:

$ echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' | sed -e 's/(.*)//' -e 's/[^0-9]/ /g' | column -t 
1 2 3 4 5 
+0

1UP Bu, ortaya çıktığım şeydi. – MattH

0

aşağıya bakın ne istediğiniz ise:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g;s/ */ /g' 
1 2 3 4 5 
:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g' 
1 2 3      4 5 

bunu daha iyi bakmak isterseniz

0

Bu, parantez içinde metin dışında çıkarılmış basamakları çıkarmanızı sağlar:

digits=$(echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
     sed 's/(.*)//' | grep -o '[0-9][0-9]*') 
echo $digits 

veya saf sed çözüm:

echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
sed -e 's/(.*)//' -e 's/[^0-9]/ /g' -e 's/[ \t][ \t]*/ /g' 

ÇIKIŞ:

1 2 3 4 5 
+0

grep -o [0-9] hakkında düşünüyordum, ancak sayı iki haneye sahipse başarısız olur, örneğin 1/20 [35] ... – Kent

+0

Cevabımı düzenledim ve saf sed'e dayalı başka bir seçenek ekledim. – anubhava

0
awk '{ first+=gensub("^([0-9]+)/.*","\\1","g",$0) 
     second+=gensub("^[0-9]+/([0-9]+) .*","\\1","g",$0) 
     thirdl+=gensub("^[0-9]+/[0-9]+ \[([0-9]+)\].*","\\1","g",$0) 
     fourth+=gensub("^.* ([0-9]+)/[0-9]+ *$","\\1","g",$0) 
     fifth+=gensub("^.* [0-9]+/([0-9]+) *$","\\1","g",$0) 
     } 
     END { print "first: " first " second: " second " third: " third " fourth: " fourth " fifth: " fifth 
     } 

Sizin için çalışabiliriz.Eğer bir fantezi alan ayırıcı ayarlarsanız Awk

0

bir geçiş yeterlidir:

awk -F '[][/ ]' ' 
    {s1+=$1; s2+=$2; s3+=$4; s4+=$(NF-1); s5+=$NF} 
    END {printf("first:%d second:%d third:%d fourth:%d fifth:%d\n", s1, s2, s3, s4, s5)} 
' 
1

TXR:

@(collect) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@(filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

eğik çizgi, uzay, açık dirsek veya yakın parantez herhangi biri bir alan ayırır veriler:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 
10/20 [30] (27/03/2012 19:32:54) word word 40/50 

çalışma:

$ txr data.txr data.txt 
first:11 second:22 third:33 fourth:44 fifth:55 

Kolay hata kontrolu eklemek için:

@(collect) 
@ (cases) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@ (or) 
@line 
@ (throw error `badly formatted line: @line`) 
@ (end) 
@ (filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

$ txr data.txr - 
foo bar junk 
txr: unhandled exception of type error: 
txr: ("badly formatted line: foo bar junk") 
Aborted 

TXR sağlam programlama içindir. Güçlü yazım vardır, bu nedenle dizeleri, rakam içermeleri nedeniyle sayı olarak kullanamazsınız. Değişkenlerin kullanımdan önce bağlanması gerekir ve bu nedenle yanlış yazılan değişkenler sessizce sıfır veya boş olarak varsayılan değil, bir unbound variable <name> in <file>:<line> tür hatası üretir. Metin çıkarımı, bir biçimdeki yanlış yorumlama girişine karşı, başka bir biçimde olduğu gibi, bir çok özel bağlamla gerçekleştirilir.

İlgili konular