Melhor maneira de aplicar a fórmula à coluna específica de inputfile e passar todas as outras colunas como estão

1

Eu regularmente preciso aplicar fórmulas simples para inserir dados em formato de tabela textual.

No começo, escrevi pequenas funções específicas para cada caso de uso. Então eu repassei o "código comum" em uma função bash. Isso funciona bem, mas se sente abaixo do ideal.

Aqui está minha "solução antiga", percorrendo todos os campos, verificando / reagindo:

calcc(){
  awkcmd='{for (i=1;i<=NF;i++){if (i==col) printf "%s ",'
  awkcmd+="$2"
  awkcmd+='; else printf "%s ", $i ;}; print "";}'
  awk -v col=$1 "$awkcmd" | column -t
}

Exemplo de uso contratado:

"Substitua groupName (Column4) em ls -l -output pelo quadrado do dayNumber (Column7)"

$ ls -l | calcc 4 '$7*$7'

Existe uma maneira melhor, ou uma ferramenta (POSIX) que até agora escapou da minha pesquisa?

EDIT: @ RalphRönnquist apontou, que $1..$n são graváveis, e assim poderia propor uma versão muito mais curta. Como print é a ação awk padrão, isso pode ser reduzido ainda mais. == >

$ calcc() { awk "\$$1=$2" | column -t; }
$ calcc-nc() { awk "\9=$1" | column -t; }

A segunda função adiciona um n e c olumn ao final com o resultado do cálculo.

    
por Alex Stragies 26.06.2016 / 14:10

1 resposta

3

awk é bom para isso, mas você pode fazer isso de maneira mais simples, com

calcc() {
    awk "{\$$1=$2;print}" | column -t
}

Se isso é melhor ou não, é sua escolha.

    
por 26.06.2016 / 15:36