Você pode usar a função match()
em awk
:
$ cat file
somedata45
somedata47
somedata67
somedata53
somedata23
somedata12
awk '
BEGIN { RS = ""; OFS = "\n"; ORS = "\n\n" }
match($2, /[0-9]+/) { value = (substr($2, RSTART, RLENGTH) + 5) * 100 }
match($3, /[0-9]+/) { $3 = substr($2, 1, RSTART - 1) value }1' file
somedata45
somedata47
somedata5200
somedata53
somedata23
somedata2800
Nós definimos o Separador de Registros para nada efetivamente permitindo o modo de parágrafo (separado por linha em branco). A segunda linha em cada parágrafo se torna nossa $2
, a terceira linha se torna $ 3, etc. Nós definimos o Output Field Separator como nova linha. Devido ao modo de parágrafo, também definimos o Output Record Separator para duas novas linhas. A saída lhe dará uma nova linha extra no final.
Usamos a função match()
para identificar o início do número. Quando uma correspondência é encontrada, a função preenche duas variáveis para nós, RSTART
e RLENGTH
, indicando quando a correspondência começa e por quanto tempo ela é. Usamos essas variáveis para fazer nosso cálculo e armazenar o resultado na variável chamada value
. Usamos a função substr
para localizar os números.
Repetimos o mesmo para $3
e, desta vez, usamos a função substr
para imprimir até onde nossos números começam e substituir a peça numérica por nossa variável que contém o valor calculado da linha anterior.
Consulte as Funções de string no guia do usuário para mais detalhes.
Atualização com base em dados reais:
Seus dados reais realmente tornam muito mais simples.
awk '
/^uidNumber/ { value = $NF }
/^sambaSID/ {
n = split ($NF, tmp, /-/)
tmp[n] = ((value + 2)* 100)
for (i=1; i<=n; i++) { nf = (nf ? nf "-" tmp[i] : tmp[i]) }
$NF = nf
nf = ""
}1' file
dn: uid=NAME02, ou=data01, dc=data02, dc=data03
uidNumber: 3423
sambaSID: S-1-1-11-1111111-111111111-11111111-342500
dn: uid=NAME03, ou=data01, dc=data02, dc=data03
uidNumber: 3245
sambaSID: S-1-1-11-1111111-111111111-11111111-324700
Você procura a linha com uidNumber
e captura o último campo. Quando você vê uma linha com sambaSID
, divide o último campo em -
e modifica o último elemento para o novo valor calculado. Você então usa um for loop
para montar seu último campo.