AWK Avançado
Programação Avançada em AWK
🔧 Arrays Associativos
# Contagem de ocorrências
{
count[$1]++
}
END {
for (item in count) {
printf "%-20s %d\n", item, count[item]
}
}
# Arrays multidimensionais
{
data[$1][$2] = $3
}
END {
for (i in data) {
for (j in data[i]) {
print i, j, data[i][j]
}
}
}
🎯 Funções Customizadas
# Função de formatação
function format_bytes(bytes) {
units["B"] = 1
units["KB"] = 1024
units["MB"] = 1024**2
units["GB"] = 1024**3
for (unit in units) {
if (bytes < units[unit] * 1024 || unit == "GB") {
return sprintf("%.2f %s", bytes/units[unit], unit)
}
}
}
# Uso da função
{
print $1, format_bytes($2)
}
Técnicas Avançadas
📊 Processamento de Dados
# Estatísticas descritivas
{
sum += $1
sumsq += $1 * $1
count++
}
END {
mean = sum/count
variance = (sumsq - sum*sum/count)/count
stddev = sqrt(variance)
print "Média:", mean
print "Desvio Padrão:", stddev
}
# Agregações complexas
{
by_group[$1]["sum"] += $2
by_group[$1]["count"]++
}
END {
for (group in by_group) {
avg = by_group[group]["sum"] / by_group[group]["count"]
print group, avg
}
}
🔄 Processamento de Texto
# Parser CSV avançado
BEGIN { FS = "," }
{
gsub(/"([^"]+)"/, "\\1") # Remove aspas
gsub(/^\s+|\s+$/, "", $0) # Trim
for (i=1; i<=NF; i++) {
gsub(/^\s+|\s+$/, "", $i)
print "Campo " i ":", $i
}
}
# Transformação de formato
{
split($0, fields, ",") # CSV para array
json = "{"
for (i=1; i<=NF; i++) {
json = json sprintf("\"%s\":\"%s\"%s",
headers[i],
fields[i],
(i==NF ? "" : ","))
}
json = json "}"
print json
}
Integração com Sistema
🛠️ Comandos do Sistema
# Execução de comandos
{
cmd = sprintf("curl -s %s", $1)
while ((cmd | getline result) > 0) {
process_data(result)
}
close(cmd)
}
# Logging avançado
function log(level, message) {
cmd = sprintf("logger -p user.%s \"[AWK] %s\"",
level,
message)
system(cmd)
}
📁 Manipulação de Arquivos
# Processamento multi-arquivo
BEGINFILE {
print "Processando:", FILENAME
}
{
# Processamento por arquivo
file_stats[FILENAME]["lines"]++
file_stats[FILENAME]["bytes"] += length($0)
}
ENDFILE {
print "Finalizado:", FILENAME
}
END {
for (file in file_stats) {
print file, file_stats[file]["lines"], "linhas"
}
}
Otimização e Performance
⚡ Técnicas de Otimização
# Cache de resultados
{
key = $1 SUBSEP $2
if (!(key in cache)) {
cache[key] = expensive_calculation($1, $2)
}
print cache[key]
}
# Processamento em lote
{
buffer[NR] = $0
if (NR % 1000 == 0) {
process_batch()
delete buffer
}
}
END {
process_batch()
}
Exercícios Práticos
🎯 Missão 1: Análise de Logs
#!/usr/bin/awk -f
# Análise avançada de logs
BEGIN {
FS = "\\|"
print "Iniciando análise..."
}
{
# Agregação por tipo
types[$1]++
# Análise temporal
split($2, time, ":")
hour = time[1]
hourly[hour]++
# Métricas
if ($3 > max_value) max_value = $3
}
END {
report()
}
function report() {
print "\nDistribuição por tipo:"
for (t in types) print t ":", types[t]
print "\nDistribuição horária:"
for (h in hourly) print h "h:", hourly[h]
}
🎯 Missão 2: ETL
#!/usr/bin/awk -f
# Transformação de dados
BEGIN {
FS = ","
OFS = "\t"
# Configuração
load_config()
}
function load_config() {
while ((getline < "config.txt") > 0) {
config[$1] = $2
}
}
{
# Transformação
for (i=1; i<=NF; i++) {
$i = transform_field(i, $i)
}
print
}
function transform_field(col, val) {
if (col in config) {
return apply_rules(val, config[col])
}
return val
}
Troubleshooting
🔧 Problemas Comuns
Gerenciamento de Memória
Performance com Grandes Arquivos
Encoding e Caracteres Especiais
Integração com Sistema
💡 Soluções
Use processamento em lote
Evite arrays desnecessários
Configure LOCALE apropriadamente
Gerencie recursos do sistema
Próximos Passos
Shell Scripting
AWK MASTERY
[🔧🔧🔧🔧🔧] 100%
STATUS: PROCESSAMENTO DOMINADO
PRÓXIMO: AUTOMAÇÃO TOTAL
14 abril 2025