Справка по команде AWK - PullRequest
       4

Справка по команде AWK

1 голос
/ 25 апреля 2011

У меня есть домашнее задание, и это вопрос.

С помощью awk создайте команду, которая будет отображать каждое поле определенного файла.

Показать дату в начале файласо строкой между и заголовком в начале вывода.

Я прочитал книгу и не могу понять, вот что у меня есть:

BEGIN {
{"date" | getline d }
{ printf "\t %s\n,d }
{ print "Heading\n" }
{ print "=====================\n }
}
{ code to display each field of file??? }

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Несколько советов по поводу awk:

Формат программы awk:

expression { action; ... }
expression { action; ... }
...

Если выражение имеет значение true, тогда выполняется блок действия. Некоторые примеры выражений:

BEGIN       # true before any lines of input are read
END         # true after the last line of input has been read
/pattern/   # true if the current line matches the pattern
NR < 10     # true if the current line number is less than 10

и т.д.. Выражение можно опустить, если вы хотите, чтобы действие выполнялось в каждой строке.

Итак, ваш блок BEGIN имеет слишком много скобок:

BEGIN {
    "date" | getline d 
    printf("\t %s\n\n",d)
    print "Heading" 
    print "====================="
}

Вы также можете написать

BEGIN {
    system("date")
    print ""
    print "Heading" 
    print "====================="
}

или выполните команду date вне awk и передайте результат как переменную awk

awk -v d="$(date)" '
    BEGIN {
        printf("%s\n\n%s\n%s\n", 
            d,
            "heading",
            "======")
    }

Команда печати неявно добавляет новую строку к выводу, поэтому print "foo\n"; print "bar" напечатает пустую строку после "foo". Команда printf требует добавления новых строк в строку формата.

Не могу больше помочь с «кодом для печати каждого поля». Луук показывает, что print $0 напечатает все поля. Если это не соответствует вашим требованиям, вам нужно быть более конкретным.

2 голосов
/ 25 апреля 2011
{"date" | getline d }

почему бы просто не напечатать текущую дату {print strftime ("% y-% m-% d% H:% M");}

и для:

{ code to display each field of file??? }

просто сделайте

{ print $0; }

, если вы хотите только первое поле, которое вы должны сделать:

{ print $1; }

если вам нужно только второе поле:

{print $2; }

, если вам нужно только последнее поле:

{print $NF;}

Поскольку NF - это номер поля в строке ......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...