bash脚本来比较2个文件中的数字

时间:2015-03-14 06:59:30

标签: bash shell .bash-profile

我想使用Bash脚本比较来自两个不同文件的2个数字。该文件是tmp $ i和tmp $(($ i-1))。我试过下面的脚本不能正常工作

 #!/bin/bash
for i in `seq 1 5`
do
    if [ $tmp$i -lt $tmp$(($i-1)) ];then
        cat tmp$i >> inf
    else
        cat tmp$i >> sup

    fi
done

样本数据
Tmp1:

0.8856143905954186 0.8186070632371812 0.7624440603372680 0.7153352945456424 0.6762383806114797 0.6405457936981878

TMP2:

0.5809579333203458 0.5567050091247218 0.5329405222386163 0.5115305043007474 0.4963898045543342 0.4846139486344327 

1 个答案:

答案 0 :(得分:0)

您没有设置$tmp,因此您最终只是简单地比较i是否小于i-1当然不是tmp2

删除美元符号名义上修复了这一点,但只会比较两个字符串(数字基数没有明确定义,因此在实践中,总是假),不能访问名为这些字符串的文件的内容。 tmp1既不大也不小于test ... -lt。 (Bash可以执行词法比较,但if [ $(cat "tmp$i") -lt $(cat "tmp$((i - 1))") ]; then 不是执行此操作的工具。)

请改为尝试:

exit(0)

为了回应您想要对十进制数执行此操作的观察,您需要一个不同的工具,因为Bash仅支持整数运算。我的方法是编写一个简单的Awk脚本来执行比较。

为了能够将其用作条件,如果条件为真,它应exit(1),否则smaller_first_line () { awk 'NR==1 && FNR==1 { i=$1; next } FNR==1 { exit($1 < i) }' "$1" "$2" } if smaller_first_line "tmp$i" "tmp$((i - 1))"; then :

为了保持主脚本的可读性,我将其封装在一个函数中,如下所示:

{{1}}