Эта статья сбивает с толку. Самая первая часть этой статьи кажется точной. Виртуальные адреса используются ядром ЦП, они сопоставляются MMU с физическими адресами, а затем используются при переходе в ОЗУ. Однако я никогда не слышал, чтобы это называлось «привязкой адреса». «Отображение» было бы более распространенным, но это просто проблема терминологии.
Затем в середине второго абзаца есть утверждение, относящееся к описанному выше процессу:
This type of binding requires the compiler to generate relocatable or offset based addresses from the source code.
Это вздор.
Перемещаемый, или позиционный -независимый код требуется в ситуации, когда программный код не знает, в каком виртуальном адресе он находится, но нужно как-то учитывать, что его можно было бы разместить в любом месте виртуальной памяти. Это не имеет ничего общего с физическим адресом, поскольку программный код, работающий в системе, не знает о них. Все адреса, которые он видит, являются виртуальными адресами.
Совместно используемые библиотеки и адрес -рандомизация компоновки пространства — два распространенных случая, когда требуется независимый от позиции -код. Это требует поддержки со стороны компилятора, поскольку код должен быть построен таким образом, чтобы он не мог содержать никаких абсолютных адресов памяти, а вместо этого делал все обращения относительно своей собственной позиции или относительно некоторой базовой позиции, хранящейся в регистре.
Все это происходит в представлении процесса о виртуальном адресном пространстве. Он нуждается в поддержке компилятора, поскольку сам код должен знать об этом.
Преобразование виртуальных адресов с помощью MMU не требует сотрудничества со стороны процесса.Вместо этого задача ОС - исправить сопоставления адресов по мере необходимости, например. если часть процесса выгружается для подкачки и требует доступа.
Сегментация также была упомянута, она работает почти так же, как объясняется в статье, за исключением того, что по крайней мере на x86 сегментация создает виртуальные адреса, поэтому виртуальная -в -физическая память отображение происходит после него.
(Все вышеизложенное основано на том, что я знаю о системах x86. Другие системы могут отличаться.)
Ваш пример ввода/вывода в лучшем случае сбивает с толку, так что не знаю, что вы действительно хотите сделать, но вот как указать нужные значения в виде строки, а затем что-то с ними сделать:
awk '
BEGIN {
rels = "INTERACTS_WITH COEXISTS_WITH"
split(rels,tmp)
for (i in tmp) {
relSet[tmp[i]]
}
}
{ print }
$2 in relSet {
print $3, $2, $1
}
' file
Можно получить дважды print
изменив порядок полей :{print $1, $2, $3}{print $3, $2, $1}
awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $1, $2, $3}{print $3, $2, $1}' file
Jose FRIEND_OF John
Aspirin INTERACTS_WITH Penicilin
Penicilin INTERACTS_WITH Aspirin
Tree COEXISTS_WITH Grass
Grass COEXISTS_WITH Tree
Jane FRIEND_OF Andrew
John INTERACTS_WITH Paula
Paula INTERACTS_WITH John
Или, короче,:
awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $0}{print $3, $2, $1}' file
Jose FRIEND_OF John
Aspirin INTERACTS_WITH Penicilin
Penicilin INTERACTS_WITH Aspirin
Tree COEXISTS_WITH Grass
Grass COEXISTS_WITH Tree
Jane FRIEND_OF Andrew
John INTERACTS_WITH Paula
Paula INTERACTS_WITH John
лучшее, что у меня есть (может быть с одной подкладкой)
awk 'BEGIN { r["INTERACTS_WITH"]=1 ; r["COEXISTS_WITH"]=1}
$2 in r {print $3,$2,$1 ; print ; next}
{print}'...
вряд ли это поможет сэкономить место.