Um script awk curto
awk '
NR == FNR { names["R"$2]; next }
$2 == "Name:" { replace = ($3 in names) }
$1 == "type" && replace { sub(/type .*/, "type 700;") }
1
' file1 file2
NR e FNR são variáveis awk incorporadas. NR conta o número total de linhas vistas até agora. FNR é o número de linhas no arquivo atual visto até agora. NR == FNR
é um idioma do awk que significa "Estou trabalhando no primeiro arquivo de dados" - o único arquivo para o qual o número do registro atual seria igual ao número total do registro.
Então, lendo o primeiro arquivo, queremos armazenar as "chaves", que estão na segunda coluna. Armazená-los como a chave da matriz associativa de "nomes" é um local útil, dado o operador in
que usamos mais tarde. Estou adicionando a letra "R" à chave porque o segundo arquivo tem isso.
Quando $2 == "Name:"
, estamos no topo de uma seção. Queremos substituir os valores de tipo se a terceira palavra nesta linha foi vista no primeiro arquivo. ($3 in names)
verifica se a terceira palavra aparece como uma chave na matriz names
associativa. Se estiver lá, faremos as substituições de todas as linhas subseqüentes, onde a primeira palavra é "tipo".
A última linha do script é interessante. 1
é outra abreviação idiomática para instruir o awk a imprimir a linha atual. programas awk são uma série de condition {action}
pares: se a condição for atendida, execute as ações especificadas. A condição pode ser omitida, caso em que a ação é executada para cada linha. A condição pode ser dada sem um bloco de ação, em cujo caso a ação padrão é imprimir a linha atual. O awk trata strings vazias e zero como false, portanto, 1
é uma condição que é sempre verdadeira. Quando estou me sentindo mais detalhado, escrevo {print}
em vez de 1
para torná-lo mais óbvio.