awk не печатает простое поле - PullRequest
0 голосов
/ 02 июля 2019

Вот небольшой сценарий awk

> # cat zzz.awk
FS=" "
/fruit/ { fr = $2; print $fr; }

, примененный к этому файлу данных

> # cat data.dat

fruit apple 1 3
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
vegetable potato 1 4

, выдающий такой вывод:

> # awk   -f zzz.awk   data.dat

fruit apple 1 3
fruit apple 1 3
fruit mango 4 9
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
fruit orange 9 8
vegetable potato 1 4

Почему это не так?Вместо этого вы получите ожидаемый вывод

apple
mango
orange

и как исправить скрипт?

(Текущая версия - GNU Awk 3.1.7, даже если предпочтительнее переносимое решение.)

Спасибо.

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Ну, этот awk просто неверен.Например, FS нельзя установить таким образом, он будет выводить каждую запись:

$ awk 'FS=" "' file
fruit apple 1 3
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
vegetable potato 1 4

Использование:

$ awk 'BEGIN{FS=" "}' file

Далее, вы не ссылаетесь на переменные как $fr в awk (если это не то, что вы после).Это оценивается как $0, и вы печатаете всю запись, которая объясняет дублированные записи в вашем выводе.Итак, чтобы обернуть это:

$ awk '
BEGIN { FS=" " } 
$1 == "fruit" { fr=$2; print fr }' file
apple
mango
orange

(или просто awk '/^fruit/{print $2}' файл)

1 голос
/ 02 июля 2019

С помощью этого небольшого awk-кода вы можете использовать его встроенным образом:

awk -F" " '/fruit/ {print $2}' data.dat
apple
mango
orange

Но вам не нужно устанавливать разделитель полей на пробел, просто оставьте его, и он должен работать. (Примечание: вкладка будет включена)

awk '/fruit/ {print $2}' data.dat
apple
mango
orange
1 голос
/ 02 июля 2019

Все скрипты awk состоят из разделов, которые имеют одинаковую структуру:

PATTERN { CODE }

Ваш нет. Используйте специальный шаблон BEGIN, чтобы делать то, что вы хотите сделать в начале. Кроме того, переменные в awk не обязательно имеют глиф $. $2 это $2, но fr это просто fr.

BEGIN { FS=" " }
/fruit/ { fr = $2; print fr; }

Конечно, вы можете просто сделать:

awk -F' ' '$1=="fruit"{print $2}' data.dat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...