Как основывать awk выбор на содержании 1 поля?

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

Сначала rootfs папка дает следующую команду:

rootfs# find . -type f -print0 | xargs --null sha1sum --binary > ../rootfs.sum

Затем в targetfs папка, проверьте каждый файл:

targetfs# sha1sum --check <PATH_TO_SUM_FILE> | grep FAILED
2
30.11.2014, 20:35
2 ответа

нужно использовать оператор согласования ~, а не оператор вычитания -:

$ awk '$2 ~ /^2$/' file

или использовать оператор равенства ==, как @гленн ответ Джекмана.

Но давайте посмотрим на ваше предыдущее решение, чтобы объяснить, почему вы получили все строки.

awk '$2 - /^2$/ {print}' numbers.txt

Здесь, с каждым вводом строки, если выражение $2 - /^2$/ верно, Вы распечатаете эту строку, иначе ничего не сделаете. Потому что вы получили все строки, поэтому кажется, что выражение $2 - /^2$/ всегда оценивалось как истинное.

Как awk оценивало это выражение?

При использовании оператора вычитания результат типа является числовым. Переменная $2 была числом, но /^2$/ является регулярным выражением, каково его числовое значение?

Ну, из POSIX awk документации:

Когда токен ERE появляется в виде выражения в любом контексте кроме в качестве правой руки оператора "˜" или "!˜" или в качестве одного из встроенные аргументы функции, описанные ниже, значение параметра результирующее выражение будет эквивалентно:

$0 ˜ /ere/

Таким образом, ваша программа awk станет:

awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt

Видите ли, каждая строка ввода будет проверяться регулярным выражением /^2$/. Так как ни одна из ваших строк ввода не совпадает, результат выражения $0 ~ /^2$/ будет равен 0.

С вашим вводом, все вторые поля имеют значение больше 0 (вычитание до 0 делает его неизменным), что является истинным значением в awk. Таким образом, выражение $2 - /^2$/ всегда истинно, потому что awk выводит все строки.

10
27.01.2020, 21:49

~ является оператором совмещения образца, а не -. Но если вы проверяете на равенство, то используйте оператор равенства ==

awk '$2 == 2' numbers.txt
3
27.01.2020, 21:49

Теги

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