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; useFNR
se 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.