2009-09-16 3 views
8

Я хочу написать общий скрипт awk, который может принимать в качестве входного файла и номер поля (в этом файле), и дать мне среднее значение этого поля в этот файл. Я хотел бы использовать это что-то вроде этого:Общий awk-скрипт для вычисления среднего значения в любом поле с помощью аргумента командной строки

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

Конечно, я могу написать сценарий, если я знаю, какое поле (например, 3 $) Я собираюсь заранее усреднить. Это было бы что-то вроде этого:

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

Но я хочу, чтобы иметь возможность изменить поле я хочу в среднем через опции командной строки. Это возможно? Благодаря!

ответ

11

Это один будет делать то, что вы хотите:

$ 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 
+1

Я не мог использовать env так, как вы описали. Пока, я только что положил реальный путь к awk. Это работает. Благодаря! – Ritesh

+0

Использование/usr/bin/env - это мой способ справиться с тем, что разные системы устанавливают awk в разных местах. Возможно, вы захотите выпустить «из env» из командной строки, чтобы узнать, где env находится в вашей системе. –

+0

/usr/bin/env: awk -f: Нет такого файла или каталога Это сообщение, которое я получаю. env находится в/usr/bin/env. Хотя вы решили мою первоначальную проблему, хотелось бы узнать, как можно использовать env. – Ritesh

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

вызов как awk -v field=3 -f avg.awk input.file

+2

Вы можете использовать NR, чтобы избежать переменной счетчика: {TOT + = $ F} END {печать полн/NR} –

+1

... при условии, что OP фактически не хочет отфильтровывать заголовки или пропускать записи. :) –

+0

Спасибо, это определенно работает! Другой ответ упрощает использование командной строки :) :) – Ritesh

 Смежные вопросы

  • Нет связанных вопросов^_^