Em um arquivo com número diferente de colunas delimitadas por espaço '', Como contar a soma das colunas. Um exemplo mostraria a necessidade:
File A:
1 2
2 3
4 5 6
1 1 1 5
Então a saída seria:
- para a coluna 1 (1 + 2 + 4 + 1) = 8
- para a coluna 2 é 11
- para a coluna 3 é 7
- para a coluna 4 é 5
command-line
scripts
Maythux
fonte
fonte
Use
numsum
para essa tarefa e separe entre processamento de dados e saída dos resultados.Instalar
num-utils
, precisamosnumsum
E comece com
Exemplo
ou com o formato desejado:
de
man numsum
exemplos de
man numsum
fonte
fonte
(( col1 += a ))
, etc. Além disso,echo "..."
é mais seguro, bem comowhile IFS= read -r ...
echo
é seguro para ser usado dessa maneira para ecoar números,$IFS
padrões no espaço em branco e espera-se que sejam números, portanto, não há necessidade de lidar com barras invertidas. A única desvantagem desta resposta é a necessidade de saber o número de colunas antes da execução.echo "[...]"
para imprimir corretamente o que você não deseja produzir não faz sentido.echo $var
ewhile read a b c
funciona aqui. No entanto, você se acostumará a escrevê-lo de maneira fraca e um dia receberá erros estranhos ao processar um arquivo mais complexo. Então você notará as variáveis de citação e o usowhile IFS= read -r ...
foi mais seguro e dirá "oh sim, Fedorqui estava certo, espero poder tê-lo por perto para abraçá-lo para demonstrar gratidão!".A julgar pelos comentários da sua própria resposta, você deseja apenas a soma de uma coluna por vez. Nesse caso, aqui está uma maneira não-awk de fazer isso:
onde você substitui o
3
número da coluna pelo qual está interessado.fonte
Aqui está uma abordagem de script Perl de uma linha. Isso depende do uso de
-a
sinalizador, que permite a divisão automática da linha atualmente lida com o-n
sinalizador na matriz@F
. Tudo o que precisamos fazer é iterar sobre esses itens e adicioná-los ao respectivo índice na$sum
matriz, assim, efetivamente, cada item da matriz é soma para cada coluna respectiva. Finalmente, imprimimos o resultado noEND
bloco de código.Como alternativa, aqui está uma abordagem completa de script Perl. Ele depende da divisão de cada linha na matriz e da iteração sobre cada item dessa matriz, adicionando cada número à sua respectiva posse na
@sums
matriz. O script imprime cada linha e produz um relatório para cada coluna. A impressão de cada linha pode ser removida adicionando#
antesprintf("%s",$line);
O uso é simples
chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Por exemplo:fonte
Uma solução simples:
Substitua i pelo número da coluna, por exemplo, coluna1:
saída é:
fonte