2009-09-16 18 views
8

Bir dosya ve alan numarası (bu dosyada) girdisi olarak alabilen ve bana bu alanın ortalama değerini verebilecek genel bir awk komut dosyası yazmak istiyorum bu dosya. Ben (ör $ 3) önceden ortalamasını gidiyorum hangi alan biliyorsanızKomut satırı argümanı aracılığıyla herhangi bir alanda ortalama hesaplamak için genel awk komut dosyası

bash$ avg.awk 3 input.file 
22 
bash$ avg.awk 4 input.file 
2001 

Elbette, senaryoyu yazabilirsiniz: ben o böyle bir şey kullanmak. Yani böyle bir şey olurdu:

//{tot+=$3; count++} 
END{ 
    print tot/count; 
} 

Ama bir komut satırı seçeneği ile ortalama istediğiniz alanı değiştirmek mümkün olmak istiyorum. Mümkün mü? Teşekkürler!

cevap

11

benzese ne istediğinizi yapacak:

$ cat avg.awk 
#!/usr/bin/env awk -f 
# Calculate average, syntax: avg.awk field-number file 
BEGIN { field = ARGV[1]; ARGV[1] = "" } 
{ sum += $field } 
END { print sum/NR } 

$ cat data 
1 5 7 
3 6 5 
8 4 6 

$ avg.awk 1 data 
4 

$ avg.awk 2 data 
5 

$ avg.awk 3 data 
6 
Bir sayım değişkeni zorunda kalmamak için NR kullanabilirsiniz
+1

Tanımladığınız şekilde env kullanamam. Şimdilik, sadece awk için gerçek yolu koymuştum. Yine de çalışıyor. Teşekkürler! – Ritesh

+0

/usr/bin/env kullanımı, farklı sistemlerin farklı yerlerde awk kurmasıyla başa çıkma yolumdur. Env'in sisteminizde nerede olduğunu öğrenmek için komut isteminden 'hangi env' yayınlamak isteyebilirsiniz. –

+0

/usr/bin/env: awk -f: Böyle bir dosya veya dizin yok Bu, alıyorum iletisidir. env,/usr/bin/env dizinindedir. İlk problemimi çözdüyseniz de, env'in nasıl kullanılabileceğini öğrenmek isterim. – Ritesh

5
{ tot += $field; count++ } 
END { print tot/count } 

çağrı awk -v field=3 -f avg.awk input.file

+2

: {tot + = $ f} END {baskı tot/NR} –

+1

... OP'nin üstbilgileri filtrelemesini veya kayıtları atlamasını istemediğini varsayarak. :) –

+0

Teşekkürler, kesinlikle işe yarıyor! Diğer cevap ise komut satırını kullanmayı kolaylaştırır :) – Ritesh

İlgili konular