Por mais fácil que seja usar vim
(ou sed
para isso), awk
é realmente totalmente capaz de fazer esse tipo de correspondência e substituição por conta própria:
$ awk '{ sub(/^.* - /, ""); sub(/,.*$/, ""); print $0 }' file
23499
Os itens acima correspondem a tudo (com awk
embutido sub()
função ) desde o início da linha até o hífen e espaço antes do número da conta e o substitui pela string vazia ""
. Em seguida, ele combina tudo, desde a vírgula até o final da linha e a substitui pela string vazia. Isso deve ser robusto (por exemplo, independentemente de quantos e-mails ou qual seja o formato deles), remova tudo, exceto o número da conta.
Se você tiver acesso a gawk
, poderá usar uma solução mais simples (somente uma chamada de função é necessária):
$ gawk 'match($0, /^.* - ([0-9]+),.*$/, a) { print a[1] }' file
23499
É claro que as soluções acima imprimem os novos dados para stdout
. Se você quiser salvar os novos dados para uso posterior, tudo o que você precisa fazer é adicionar > newfile
ao final do comando acima (observe que >
sobrescreve; se você preferir acrescentar, use >>
).
awk
tem muitas limitações próprias (por exemplo, trabalhar com muitos arquivos ao mesmo tempo), por isso nem sempre é a melhor ferramenta para esse tipo de manipulação. No entanto, é muito bom no que faz, por isso, quando o seu caso de uso estiver alinhado com o round-house, recomendo vivamente a sua utilização.
Além disso, a solução acima não requer nenhuma interface interativa (como vim
) e nenhuma tubulação.