2016-03-21 14 views
2

Büyük bir tablonun her alanında bulunan eleman/kelime sayısını saymaya çalışıyorum. Alanlar, whitspaces ve alan elemanları ("kelimeler") virgüllerle ayrılır. Tabloda ayrıca 0 öğesine eşdeğer olan boş alanlar (örneğin iki veya daha fazla ardışık beyaz boşluk) bulunur.awk alanındaki her alandaki değerlerin sayısı, çıktı tablosu

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 

(I birinci sütundaki istiyorum)

:

val1 this,is,text this,more,text stop 
val2 this,is a field 
val3 end,text 

Bu, istenen çıkış olacaktır: Tablodan bu gibi örneğin

,

Lütfen ilk satırdaki stop değerinden iki boş alan olduğunu ve dördüncü alanın 0 öğesine sahip olduğunu unutmayın. Diğer hatlarda da benzer şeyler olur.

Her alan için elemanların arzu edilen sayıda bir dizi oluşturmak için awk'ın ayırma işlevi kullanıyorum:

awk '{ for(i = 2; i <= NF; i++) { 
$i=split($i,a,",") ; { if (!$i) { $i="0" }}; 
}; print $0}' input 

I an bir dizi eleman her bir alan i bölme ediyorum ve bu değeri $i değişkenine atamak. Verilen alanda 0 eleman durumunda, (!$i), $i=0. Gördüğünüz gibi, 0 değerleri

val1 3 3 1 
val2 2 1 1 
val3 2 

atlanmıştır:

Ama bu benim şimdiki istenmeyen çıkıştır. Boş alanlara 0 değerinin atanmasıyla ilgili bir sorun olduğunu düşünüyorum.

Bana yardım eden var mı? Şimdiden çok teşekkürler!

cevap

3

Sen tek beyaz alan ayırıcı olarak boşluk istediğinizi belirlemeniz gerekir: Bu durumda

awk -F"[ ]" '{str=$1 
       for(i=2; i<=NF; i++){str=str" "split($i, arr, ",")} 
       print str}' test1 

, çıkışı: printf ile

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 
+0

Ah canım. Çok basit. Çok teşekkürler! – XGrau

3

temelde aynı çözüm

$ awk -F'[ ]' '{printf "%s ", $1; 
       for(i=2;i<=NF;i++) printf "%s ", split($i,a,","); 
       print ""}' file 

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 
İlgili konular