Função definida pelo usuário para encontrar no máximo 4 números

1

Eu tenho um script básico para encontrar o máximo de 2 números usando uma função definida pelo usuário; mas preciso convertê-lo para aceitar 4 números e estou tendo dificuldades. Aqui está o roteiro.

#!/bin/bash
echo $1 $2 | awk '
{
    print max($1, $2)
}

function max(a, b) {
    return a > b ? a: b
}'

Você poderia simplesmente executá-lo fazendo: ./scriptname 1 2 (ou quaisquer dois números que você queira) e a saída seria o máximo dos dois números. Eu acho que posso fazer o seguinte.

#!/bin/bash
echo $1 $2 $3 $4 | awk '
{
    print max($1, $2, $3, $4)
}

function max(a, b, c, d) {
    return a < b ? a: b
}' 

Estou tendo problemas com a linha 7, a linha "return". Alguma sugestão?
obrigado -CableGuy

    
por cableguy5533 19.03.2018 / 18:36

4 respostas

2

Você pode usar a função de 2 argumentos - várias vezes :

$ cat scriptname 
#!/bin/bash
echo $1 $2 $3 $4 | awk '

function min(a, b) {
    return a < b ? a: b
}

{
    print min(min(min($1,$2),$3),$4)
}'

depois, por exemplo

$ ./scriptname 3 1.2 -0.4 77
-0.4

Se você precisar escrevê-lo como uma função de 4 argumentos, sugiro algo como

function min(a, b) {
    return a < b ? a : b
}

function min4(a,b,c,d) {
    return min(min(min(a,b),c),d)
}

{
    print min4($1,$2,$3,$4)
}
    
por 19.03.2018 / 19:05
4

Se você não se importar em usar o Bash em vez do AWK:

find_max() {
  local max number

  max="$1"

  for number in "${@:2}"; do
    if ((number > max)); then
      max="$number"
    fi
  done

  printf '%d\n' "$max"
}

Uso:

$ find_max 12 64 2 455 23 99
455
    
por 19.03.2018 / 18:47
0

Você pode tentar com este awk:

echo -3.89 -1.2 -0.217 -48 | awk '{a=$1;for(i=2;i<=NF;i++)a=$i>a?$i:a;print a}'
    
por 19.03.2018 / 22:10
0

O pacote num-utils inclui numbound , que resolve o problema geral problema, (não está limitado a 4 args):

printf "%s\n" 5 88.3 22 -22 -333 5 | numbound 

Saída:

88.3

Isso pode ser feito em uma função simples que analisa os argumentos da linha de comando:

max() { printf "%s\n" "$@" | numbound ; }

Exemplo:

max 55 33 2 99 22

Saída:

99
    
por 24.03.2018 / 03:37