Adicione uma lista de valores das colunas A e B separados por espaço e mostre o resultado da soma [duplicado]
Eu tenho um arquivo chamado fold.txt
. Possui dois valores em cada linha separados por um espaço. Se eu disser que o primeiro valor representa a coluna A e o segundo valor após o espaço é a coluna B, como posso somar todos os valores da coluna A e todos os valores da coluna B e mostrar a soma de cada coluna individualmente?
Estou esperando algo assim:
$ cat fold.txt
100 500
200 300
700 100
Resultado:
Total count Column A = 1000
Total count column B = 900
Respostas
Com awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
na linguagem awk que é uma ferramenta para fins de processamento de texto, $1
representa o valor da primeira coluna, $2
representa o valor da segunda coluna, $3
para a terceira e assim por diante e um especial NF
é representar o Id da última coluna e consequentemente $NF
é o valor da última coluna (então você pode substituir $2
acima com $NF
também; e sim, você pega quando NF
é a última coluna Id, então o valor da variável diz quantas colunas você tem (sua atualização de valor para cada linha awk é lida da entrada)).
Para lidar com o caso extremo em que o arquivo de entrada está vazio e ainda obtém a saída numérica, adicionamos 0 ao resultado, forçando awk
a saída do resultado numérico.
colunas (ou campos) são awk
distinguidos pela FS
variável ( F eild S eparator) cujo padrão é usar Espaço / Tabs. se quiser que as colunas sejam divididas em caracteres diferentes, você pode redefini-lo com a -F
opção de awk
como em:
awk -F'<character-here>' '...' infile
ou dentro do BEGIN{...}
bloco como com FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
por exemplo, para um arquivo de entrada como abaixo (agora é uma vírgula em vez de espaço):
100,500
200,300
700,100
você pode escrever seu awk
código da seguinte forma:
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Ou dentro do BEGIN
bloco:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Tornando-se um pouco complexo e somando todas as N colunas do seu arquivo de entrada no seguinte exemplo:
100,500,140,400
200,300,640,200
700,100,400,130
Então, falamos sobre NF
no primeiro parágrafo (o valor NF está dizendo quantas colunas você tem (atualização por cada linha)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
a única coisa nova aqui é que usamos awk
array para endereçar o mesmo Id de coluna tirando do valor de i
e adicionar seus valores $i
a esse array (o índice / chaves deste array são Ids de coluna); então, no END{...}
bloco, fazemos um loop em nosso array nas chaves que são vistas e, em seguida, imprimimos o ID da coluna primeiro e depois a soma dos próximos a ele, você verá a saída como abaixo:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
É um bom trabalho para DC.
dc lê primeiro os dados de fold.txt e depois do código de sum_col_dc.
Use-o assim: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Com um pouco mais de detalhes:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
Aproveite o DC
Mais explicações sob demanda.