ERROR: expressão inteira esperada - comparando tabelas

1

Eu tenho um pequeno programa bash, que me permite comparar tabelas (tendo estilo de nomenclatura semelhante) e que copia para outro diretório o arquivo com o maior valor na primeira linha da quarta coluna (com separador de espaço) (os valores da quarta coluna são números decimais, por exemplo, 1111.22).

#! /bin/bash
river=lobith_rhine
highest=1
for model in H08
do
  for gcm in IPSL-CM5A-LR
  do
    for scenario in hist rcp8p5
    do
      for x in ${model}_${gcm}_${scenario}_${river}[1-9]/${model}_${gcm}_${scenario}_${river}[1-9].txt
      do
        fourth="$(awk 'NR==1{print $4}' $x)"
        if [ "$highest" -lt "$fourth" ];then
            highest=$fourth
            hifile=$x
        fi
      done
      echo "highest was $highest in $hifile"
      cp $hifile /home/steve/high_test/${model}_${gcm}_${scenario}_${river}.txt
    done
  done
done

Infelizmente, a linha 13 if [ "$highest" -lt "$fourth" ];then produz a seguinte mensagem de erro:

integer expression expected

Então, eu li alguma documentação sobre operadores de comparações e descobri que posso substituir a linha problemática por

if [ "$highest" \< "$fourth" ];then

Mas isso não está funcionando corretamente, pois compara os valores de ordem alfabética ASCII ao invés do valor inteiro.

Alguém tem uma ideia sobre como lidar com esses problemas?

    
por steve 11.11.2015 / 14:42

2 respostas

1

Ok, essa é uma solução alternativa que deve funcionar

#! /bin/bash
river=lobith_rhine
highest=1
for model in H08
do
  for gcm in IPSL-CM5A-LR
  do
    for scenario in hist rcp8p5
    do
      RESULT=$(awk 'FNR==1 {print $4, FILENAME}' ${model}_${gcm}_${scenario}_${river}[1-9]/${model}_${gcm}_${scenario}_${river}[1-9].txt | sort -n -r| head -1) 
      highest="$(echo $RESULT | cut -d ' ' -f1 )"
      hifile="$(echo $RESULT | cut -d ' ' -f2 )"
      echo "highest was $highest in $hifile"
      cp "$hifile" "/home/steve/high_test/${model}_${gcm}_${scenario}_${river}.txt"
    done
  done
done

A ideia está dentro do comando awk sobre um monte de arquivos,

 awk 'FNR==1 {print $4, FILENAME}' *txt | sort -n -r| head -1 | cut -d ' ' -f2

onde:

Ps > é possível pensar uma solução sem ordenar e cabeça mas só com o awk.

awk 'FNR==1 {i++; A[i]=$4; B[i]=FILENAME} 
     END{ c=A[1];d=B[1];  
          for (j=2;j<i;j++){
            if (A[j]>c){c=A[j];d=B[j];}  
          } 
          print c,d ;
        }' *txt
    
por 11.11.2015 / 16:15
1

Se você tiver bc disponível, poderá substituir a linha 13 por

if [ $(echo "$highest<$fourth" | bc) = 1 ];then
    
por 11.11.2015 / 16:11

Tags