July 2022 mac os Monterey V12.1
awk --version 20200816
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)
Por que awk -F
funciona para a maioria das letras, mas NÃO para a letra t
? Eu tenho a solução, mas gostaria de entender porque o awk falha para a letra t
.
# Count 'e's
% echo "tweeter" | awk -F "e" '{print NF-1}'
3
# Count 'r's
% echo "tweeter" | awk -F "r" '{print NF-1}'
1
# (Attempt to) count 't's
% echo "tweeter" | awk -F "t" '{print NF-1}'
0 <=== ????
# Use gsub()
% echo "tweeter" | awk '{print gsub(/t/, "")}'
2
Porque:
Isso é da página de manual do FreeBSD awk , e os utilitários que vêm com o macOS geralmente são algumas versões antigas do FreeBSD ou algo assim.
De certa forma, isso parece uma abreviação útil para arquivos com valores separados por tabulação, mas com outras letras tomadas como estão, é confuso. Só funciona assim com
-F
, usar-v FS=t
não faz isso.O recurso não é POSIX, pois POSIX diz que
-F x
é o mesmo que-v FS=x
. A maioria dos outros awks que testei trataramt
como a letra literal (algumas versões do gawk, mawk e Busybox).A versão do awk que por exemplo o Debian tem no
original-awk
pacote ("One True AWK" ou "BWK awk" presumivelmente das iniciais de Brian W. Kernighan) o suporta, e pelo menos a Wikipedia parece indicar que seria o mesmo software FreeBSD usa. Este parece ser baseado na versão descrita no livro de 1988 "The AWK Programming Language", mas não sou especialista em linhagens awk e não sei se evoluiu significativamente desde então. Esse está no github , mas a documentação não parece descrever o recurso. O caso especial pode ser visto no código (onde é descrito como "uma verruga" em um comentário).Você pode obter o mesmo comportamento com GNU awk no modo de compatibilidade BWK-awk. :
a maneira absolutamente mais segura, independentemente da combinação shell/env, é usar uma caixa quadrada e uma barra invertida dupla para a guia
com a duplicação de
\\
mesmo estando entre aspas simples, se algum ambiente ficar muito inteligente e tentar remover um deles,awk
ele ainda será o byte subjacente da própria guia.se você é realmente paranóico com isso, então faça