Adicione uma lista de valores das colunas A e B separados por espaço e mostre o resultado da soma [duplicado]

Dec 29 2020

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

5 αғsнιη Dec 29 2020 at 00:00

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, $1representa o valor da primeira coluna, $2representa o valor da segunda coluna, $3para 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 $2acima com $NFtambé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 awka saída do resultado numérico.

colunas (ou campos) são awkdistinguidos pela FSvariá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 -Fopção de awkcomo 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 awkcó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 BEGINbloco:

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 NFno 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 awkarray para endereçar o mesmo Id de coluna tirando do valor de ie adicionar seus valores $ia 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
ctac_ Dec 30 2020 at 01:56

É 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.