linux 从文件中读取数字并在if语句中比较它们

slsn1g29  于 2023-11-17  发布在  Linux
关注(0)|答案(2)|浏览(107)
#!/bin/bash

nomFich="fichier.txt"

n=$(sort $nomFich | uniq | wc -l)

while read nom; do
    read pren
    read score
     if [[ $score -gt 50 ]]; then
        echo $nom
        echo $pren
        echo $score  
    fi
    
done < "StudentThatCompletedtheExam.txt"

字符串
我正在阅读nomFich文件中的行,该文件的结构如下:

mohamed
ali
90
ali
salem
95
paul
bens
46


我想一次读3行,这样我就可以存储所有变量,然后如果第三个变量score大于50,我就把所有3个变量放到另一个文件中。
问题是如果语句不起作用,它无法比较$score50控制台输出:

$ ./test.sh 
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "


我试着把$score转换成int型,但是不行,我试了其他方法,我想这样做,因为对于初学者来说,理解起来很简单。

yebdmbv4

yebdmbv41#

运行:

vim StudentThatCompletedtheExam.txt -c "set ff=unix" -c ":wq"
vim fichier.txt -c "set ff=unix" -c ":wq"

字符串
我认为这只是文件StudentThatCompletedtheExam.txt的问题,但我已经包括这两个文件只是以防万一。
这将解决问题的eol被dos格式化,然后脚本shoudl工作正确。我已经测试了它在我的系统上,并已能够复制的问题,修复工程。

c2e8gylq

c2e8gylq2#

使用工具可能比使用Bash更容易做到这一点。
下面是一个awk:

awk 'FNR%3==1{split("",rec)}
{rec[FNR%3]=$1}
FNR%3==0 && $1>50{print rec[1] ORS rec[2] ORS $1}' file

字符串
或者一个Ruby:

ruby -e '$<.read.split(/\R/).
            each_slice(3){|first,last,score| 
                puts "#{first}\n#{last}\n#{score}" if score.to_i>50} ' file


或者打印:

mohamed
ali
90
ali
salem
95


如果你有DOS行尾,你可以设置输入记录分隔符来过滤掉\r,如下所示:

awk -v FS="\r?\n" 'FNR%3==1{split("",rec)}
{rec[FNR%3]=$1}
FNR%3==0 && $1>50{print rec[1] ORS rec[2] ORS $1}' file


Ruby已经可以处理DOS或Unix的行尾,因为\R上的分割是通用的。

相关问题