Não tenho certeza absoluta do que seu if
está tentando fazer lá. NR
é o número de registros; use NF
para o número de campos, se é isso que você está procurando. Você não pode colocar {}
blocos no meio de coisas assim.
Acho que o que você está procurando é comparar o valor de um campo nesta linha com um campo na linha anterior, imprimindo a soma quando chegarmos a um novo "grupo" de dados. Se for esse o caso, este script fará o que você quer e eu acho que equivale ao que você queria:
{
if (last && $1 != last) {
print last, sum
sum = 0
}
sum = sum + $2
last = $1
}
END {
print last, sum
}
Criamos uma nova variável last
para manter o valor do primeiro campo ( $1
) na linha anterior. Usaremos isso para rastrear qual grupo estamos analisando.
- Para cada linha (porque temos
{ ... }
no nível superior), primeiro testamos se a)last
está definido (porque não queremos imprimir nada na primeira linha) eb) o valor do primeiro campo é diferente delast
. Se estiver, imprimimos o valor delast
, um espaço (por causa de,
) e osum
que calculamos. (Se você quiser uma aba, use"\t"
entre aspas como você tinha) - Após a impressão, redefinimos
sum
para zero. - De qualquer forma, adicionamos o valor do segundo campo (
$2
) asum
. - Para cada linha, salvamos o primeiro campo (nosso grupo) em
last
, para que possamos usá-lo para comparação na próxima linha. - Finalmente, queremos imprimir o último grupo também. Para isso, usamos um bloco
END { ... }
. Ele é executado no final do programa quando ficamos sem dados. Imprimimos a soma e o grupo com o qual estamos trabalhando, exatamente como fizemos antes.
Se eu correr:
awk -f sum.awk < data
com seu arquivo de dados, recebo esta saída:
A 600
B 900
A 2100
conforme desejado.
Existem maneiras mais simples de fazer isso, tanto no awk quanto no contrário. Em particular, podemos substituir o corpo acima por:
last && $1 != last {
print last, sum
sum = 0
}
{
sum = sum + $2
last = $1
}
Aqui usamos a sintaxe de bloqueio condicional do awk em vez de um teste if
explícito: o comportamento deste programa é idêntico ao acima, mas é mais idiomático. Não é muito diferente neste exemplo, mas é útil saber se você está aprendendo o awk.
Se o exemplo de arquivo que você forneceu for literalmente o que é, com #sum=
linhas (ou similar), você pode usar este script:
{
sum = sum + $2
if (NF == 3) {
print $1, sum
sum = 0
}
}
Para cada linha, isso adiciona o valor do segundo campo à variável sum
. Em linhas que têm exatamente três campos ( NF == 3
), imprimimos nosso total e redefinimos sum
para zero.