Короткий awk-скрипт
awk '
NR == FNR { names["R"$2]; next }
$2 == "Name:" { replace = ($3 in names) }
$1 == "type" && replace { sub(/type.*/, "type 700;") }
1
' file1 file2
NR и FNR являются встроенными переменными awk. NR подсчитывает общее количество просмотренных строк. FNR — это количество строк в текущем файле, просмотренных на данный момент. NR == FNR
— это идиома awk, которая означает «Я работаю с первым файлом данных» --— единственный файл, для которого номер текущей записи будет равен общему номеру записи.
Итак, читая первый файл, мы хотим сохранить "ключи", которые находятся во 2-м столбце. Хранение их в качестве ключа ассоциативного массива «names» — удобное место, учитывая оператор in
, который мы будем использовать позже. Я добавляю букву «R» к ключу, потому что она есть во втором файле.
Когда $2 == "Name:"
, мы находимся в начале раздела. Мы хотим заменить значения типа, если 3-е слово в этой строке было замечено в первом файле. ($3 in names)
проверяет, появляется ли 3-е слово как ключ в ассоциативном массиве names
. Если он есть, то мы выполним замену для любых последующих строк, где 1-е слово — «тип».
Последняя строка сценария интересна. 1
— еще одно идиоматическое сокращение, указывающее awk на печать текущей строки. awk-программы представляют собой серию condition {action}
пар :, если выполняется условие, выполнять заданные действия. Условие можно опустить, в этом случае действие выполняется для каждой строки. Условие может быть задано без блока действий, и в этом случае действие по умолчанию — напечатать текущую строку. awk считает пустые строки и ноль ложными, поэтому условие 1
всегда истинно. Когда я чувствую себя более многословным, я пишу {print}
вместо 1
, чтобы сделать его более очевидным.
Благодаря сообщению на Reddit я обнаружил, что в большинстве руководств не говорится о том, что во время начальной загрузки системы необходимо установить linux
и linux-firmware
, а также base
. Когда вы загружаете систему, запустите:
pacstrap /mnt base linux linux-firmware
Я долго пытался найти ответ, поэтому надеюсь, что любой, у кого есть такая же проблема, сможет найти его быстрее, чем я!