Одна возможность:
Содержимое script.awk (с комментариями):
## When 'FNR == NR', the first input file is in process.
## If line begins with '[', get the section string and reset the position
## of its objects.
FNR == NR && $0 ~ /^\[/ {
object = substr( $0, 2, length($0) - 2 )
pos = 0
next
}
## This section process the objects of each section. It saves them in
## an array. Variable 'pos' increments with each object processed.
FNR == NR {
arr_obj[object, $0] = ++pos
next
}
## This section process second file. It splits line in '.' to find second
## part in the array and prints all.
FNR < NR {
ret = split( $0, obj, /\./ )
if ( ret != 2 ) {
next
}
printf "%s.%d\n", obj[1], arr_obj[ obj[1] SUBSEP obj[2] ]
}
Запустите скрипт (важен порядок входных файлов, object.txt имеет разделы с объектами и input.txt вызовы):
awk -f script.awk object.txt input.txt
Результат:
SomeSection.2
OtherSection.1
OtherSection.2
РЕДАКТИРОВАТЬ на вопрос в комментариях:
Я не эксперт, но постараюсь объяснить, как я это понимаю:
SUBSEP
- это символ для разделения индексов в массиве, когда вы хотите использовать разные значения в качестве ключа. По умолчанию это \034
, хотя вы можете изменить его как RS
или FS
.
В инструкции arr_obj[object, $0] = ++pos
запятая объединяет все значения со значением SUBSEP
, поэтому в этом случае будет получено:
arr_obj[SomeSection\034Blah] = 1
В конце скрипта я получаю доступ к индексу, используя explicity эту переменную arr_obj[ obj[1] SUBSEP obj[2]
, но с тем же значением, что и arr_obj[object, $0]
в предыдущем разделе.
Вы также можете получить доступ к каждой части этого индекса, разделив ее с помощью переменной SUBSEP, например:
for (key in arr_obj) { ## Assign 'string\034string' to 'key' variable
split( key, key_parts, SUBSEP ) ## Split 'key' with the content of SUBSEP variable.
...
}
с результатом:
key_parts[1] -> SomeSection
key_parts[2] -> Blah