错误:需要整数表达式 - 比较表

错误:需要整数表达式 - 比较表

我有一个小型 bash 程序,它允许我比较表(具有相似的命名风格),并将第四列第一行(带有空格分隔符)具有最高值的文件复制到另一个目录(第四个的值)列是十进制数字,例如 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

不幸的是,第 13 行if [ "$highest" -lt "$fourth" ];then产生以下错误消息:

integer expression expected

因此,我阅读了一些有关比较运算符的文档,发现我可以将有问题的行替换为

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

但这不能正常工作,因为它只是比较 ascii 字母顺序值而不是整个值。

有谁知道如何处理这些问题?

答案1

好的,这是一个应该有效的解决方法

#! /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

这个想法是在里面awk命令控制一堆文件,

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

在哪里:

Ps> 可以想出一个没有 sort 和 head 而只使用 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

答案2

如果你有bc可用的话,你可以将第 13 行替换为

if [ $(echo "$highest<$fourth" | bc) = 1 ];then

相关内容