Использование функции strftime в mawk - PullRequest
8 голосов
/ 10 сентября 2010

Я пытаюсь создать сценарий AWK, который будет фильтровать входной файл по некоторому шаблону и использовать функцию strftime () для некоторых вычислений.

($2 ~ /^[HB]/ && $2 ~ /n$/){
        print strftime("%Y")
}

Используемый переводчик - mawk. При запуске этого скрипта с помощью этой команды:

awk -f script3 inputFile

Я получаю сообщение об ошибке: "функция strftime никогда не определяется"

Ответы [ 2 ]

12 голосов
/ 12 сентября 2011

Установка GAWK вернет вам функцию strftime, которая изначально отсутствует в awk.

В Ubuntu 11.10 или аналогичном дистрибутиве вы должны выполнить следующую команду, чтобы получить GAWK

sudo apt-get install gawk

Вы также можете использовать его в gawk, однако вам не нужно это делать, и вы можете просто продолжить работу со своим оригинальным сценарием awk.

3 голосов
/ 10 сентября 2010

Ну, ясно, что mawk не имеет функции strftime.

У меня нет mawk здесь, так что непроверенный:

awk -f script -v the_year=$(date "+%Y") inputFile

и script имеет (объединяя два регулярных выражения:

$2 ~ /^[HB].*n$/ { print the_year }

Если год должен быть как-то равен $ 0, тогда вы сможете разобрать его вне строки. Дайте нам более подробную информацию о вашем вкладе.

EDIT

ввод состоит из нескольких строк, которые выглядят так: «12768 Ashwari F 20 11 1985». В основном я должен отфильтровать все те, чье имя начинается с B или H и заканчивается п. Кроме того, я должен рассчитать возраст каждого отфильтрованного студента и выяснить средний возраст всей группы.

awk -v this_year=$(date +%Y) -v today=$(date +%Y%m%d) '
    $2 ~ /^[BH].*n$/ {
        age = this_year - $6
        if (today < $6 $5 $4) { age-- } # I assume those fields are the birthday 
        total_age += age
        count ++
        print $2 " is " age " years old"
    }
    END {
        print "average age = " total_age/count
    }
' inputFile
...