Como adicionar certas colunas usando o awk no script unix

0

Eu tenho que adicionar linhas e escolher colunas. Eu quero usar

Arquivo

1 2 3
1 2
1

sem argumentos, o script deve retornar

6 (1st row)
3 (2nd row)
1 (3rd row)

Este é o código desta parte que fiz:

awk '{ for(i=1; i<=NF;i++) sum+=$i; print(sum); sum=0 }' $FILE

com o argumento 1 e 2 (número de colunas), o script deve adicionar todas as linhas da coluna 1 e 2, por isso deve retornar:

3 (1st+2nd column)
3 (1st+2nd column)
1 (1st+2nd (blank) column))

A única coisa que preciso é uma condição para somar apenas certas linhas

    
por codddeer123 22.12.2016 / 10:51

2 respostas

0

você pode passar variáveis para awk e seu comando ficaria assim:

awk -v col1=1 -v col2=2 '{ for(i=1; i<=NF;i++) {if (i == $col1 || i == $col2 ) sum+=$i}; print(sum); sum=0 }' $FILE
  • -v var=value atribui valor à variável de programa var.

você pode adicionar quantas colunas desejar, basta adicionar -v colx=value e adicionar ot à condição || i == $colx

Se você quiser passar o número de colunas para shell script, você pode adicioná-los em uma matriz digamos columnsArray , então crie uma variável columns=$(echo "${columnsArray[@]}") , então o seu comando deve ficar assim:

awk -v outCols="$columns" 'BEGIN{split(outCols, cols, " ")} { for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' $FILE

por exemplo

#!/bin/bash
columns=$(echo "$@")
awk -vcolss="$columns" 'BEGIN{split(colss, cols, " ")}{ for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' test

retornaria:

3
3
1
    
por 22.12.2016 / 11:00
0

Ok, há resposta que queria alcançar:

    #!/bin/bash
    PLIK=$1
    shift
    d=${@}
    awk -v c="$d" 'BEGIN {split(c,a," ")}{c=0; for(i in a) c+=$a[i]; print c}' $FILE

./script.sh file.txt 1 2 retornará 3 3 1 e ./file.sh file.txt 2 3 retornará 5 2 0 , o que está correto

    
por 22.12.2016 / 13:03

Tags