Usando awk no arquivo de entrada original, antes da limpeza:
awk '/account number [[:digit:]]+/ { match($0, "account number ([[:digit:]]+)", a); print NR ";" substr($0, a[1, "start"], a[1, "length"]); }' input
Isso extrai o número da conta e imprime o número da linha no início da linha:
1;2345356432
3;8623525534
Se você quiser extrair o número pré-processado do arquivo limpo:
awk '/account number [[:digit:]]+/ { match($0, "account number ([[:digit:]]+)", a); print $1 ";" substr($0, a[1, "start"], a[1, "length"]); }' input
Dividindo isso um pouco:
-
/account number [[:digit:]]+/garante que processamos apenas linhas que correspondam a "número da conta" seguido por um número; -
match($0, "account number ([[:digit:]]+)", a)procura o padrão novamente e armazena as posições e comprimentos dos grupos correspondentes (([[:digit:]]+), o número) na matriza; -
print NR ";" substr($0, a[1, "start"], a[1, "length"])imprime o número do registro ( ie o número da linha; useFNRse você quiser processar vários arquivos), seguido por;, seguido pela substring correspondente ao primeiro grupo:a[1, "start"]fornece seu índice inicial,a[1, "length"]seu comprimento (isso foi preenchido pormatch).
Tudo isso pressupõe que haja no máximo um número de conta por linha.
A segunda variante imprime $1 em vez de NR , ou seja, o primeiro campo no arquivo, que é o número da linha pré-processada.