Eu preciso de alguma ajuda ou conselho wrt awk
e seu uso de expressões regulares. Eu tenho um arquivo de entrada de dados com uma estrutura irregular. Para analisar este arquivo corretamente, preciso reconhecer uma linha da seguinte forma:
@ 8/1/17, 10:04 PM
Uma linha com este padrão marca o fim de uma transação completa. É simplesmente um carimbo de data e hora precedido por um espaço e o @
caractere.
Eu criei uma expressão regular que parece corresponder no uso "mais":
\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M
No entanto, não parece corresponder quando usado na seguinte awk
declaração:
$ awk 'match($0, /\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M/) {print $0}' testfile2.txt
Meu sistema ( macos mojave ) tem uma versão antiga do awk
awk version 20070501
.
Também encontrei:
grep -e
falha ao combinar esse padrão com qualquer linha em ,testfile2.txt
mas corresponde às linhas que eu esperava que elas correspondessem.egrep
grep -E
awk 'match($0, /\@/) {print $0}' testfile2.txt
corresponde (e imprime) as linhas esperadas, mas não posso confiar em um único caractere!
Aqui está testfile2.txt:
+13054261988: Encaminhando dados para o repositório primário
@ 1/7/18, 4:21 PM
+16744774911: Use este URL: https://www.repo-prime.ga/
@ 1/7/18, 4:22 PM
+ 13054261988: Fará. Senhas OK?
@ 07/01/18, 18:12
+16744774911: Não, use 2FA para todas as transações
@ 07/01/18, 20:56
+13054261988: Usando o autenticador do Google?Em caso afirmativo, precisará de informações adicionais.
@ 07/01/18, 21:36
+13054261988: RSVP o mais rápido possível, tenho transações que precisam ser carregadas.
@ 07/01/18, 21:46
Minha expressão regular não corresponde ao awk
uso devido a um erro que não consigo ver na minha awk
declaração ou é devido ao próprio regex, uma combinação de ambos, etc?
/\W
(caractere não-palavra) antes@
? como no seu arquivo de texto@
está no início da linha\@
,\,
(:
eles não são caracteres especiais)match()
é redundante se precisar apenas corresponder a um padrãoParece que versões muito antigas do awk não tinham
{…}
capacidade.Esta sintaxe regex mais antiga deve corresponder em qualquer awk:
Se o seu awk puder corresponder a expressões de colchetes como
[[:blank:]]
, a regex poderá ser um pouco mais flexível:Se combinar um (ou mais) dígitos é bom o suficiente (não consigo ver por que não), você pode usar o regex mais curto:
E você pode adicionar início
^
e fim$
para tornar a regex bem mais restritiva, se necessário.Não estou usando
match
para uma correspondência tão simples de uma linha, mas o mesmo regex funcionaria perfeitamente bem com essa função.