как мне передать переменную внутри awk match?

!X означает "коммуникация административно запрещена", это должно быть задокументировано на страницах руководства (8). Поскольку Linux использует UDP для маршрутов трассировки, это может происходить из правила --reject-with icmp-host-prohibitedв пункте назначения.

1
13.03.2017, 17:18
2 ответа

Вы не можете отсортировать все записи только одним проходом.

Чтобы ответить на ваш главный вопрос буквально, чтобы сопоставить поле с переменной, нужно просто сделать match($2,i) без /.../ (или match($2, i"\"") для i, за которым следует ". Используя обычный синтаксис конкатенации строк).

Даже этот вариант даст правильные результаты для записи, содержащей "4":

awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")

Но этот вариант, хотя и будет работать без ошибок, не будет автоматически сортировать данные за один проход, как можно было бы ожидать:

awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1

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

Вот другой подход, который работает с вашим образцом файла:

awk  -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1

Смотрите онлайн тест здесь

Использование разделителя " текст первой строки "fechaName": "1",.... разделится на 4 части и 1 (поле $4) может быть использовано непосредственно как целое число.

Часть a[$4]? a[$4]=a[$4] ORS $0:a[$4]=$0 является просто if-then-else:

если a[$4] (==> a[1] для первой строки) уже имеет значение, то добавьте эту строку к предыдущему содержимому a[$4], используя разделитель выходных записей (ORS), который является новой строкой (или может быть простым "\n") - иначе просто примените $0 к a[$4]

Наконец, в конце секции мы просто выводим этот массив a.

Здесь нужно сказать, что sort будет чертовски быстрее awk для этой операции:

LC_ALL=C sort -t"\"" -k3 file1
0
28.01.2020, 01:00

Кажется, вы хотите напечатать строки, содержащие от 1 до 7. Это будет что-то вроде

awk '/"fechaName": "[1-7]"/ { print }'
0
28.01.2020, 01:00

Теги

Похожие вопросы