我正在编写一个脚本,用于查找字符串中的最小值。字符串以cat <file>
的形式提供给我,然后我解析该字符串中的每个数字。该字符串仅包含一组以间隔分隔的数字。
这是代码:
echo $FREQUENCIES
for freq in $FREQUENCIES
do
echo "Freq: $freq"
if [ -z "$MINFREQ" ]
then
MINFREQ=$freq
echo "Assigning MINFREQ for the first time with $freq"
elif [ $MINFREQ -gt $freq ]
then
MINFREQ=$freq
echo "Replacing MINFREQ with $freq"
fi
done
以下是我得到的输出:
800000 700000 600000 550000 500000 250000 125000
Freq: 800000
Assigning MINFREQ for the first time with 800000
Freq: 700000
Replacing MINFREQ with 700000
Freq: 600000
Replacing MINFREQ with 600000
Freq: 550000
Replacing MINFREQ with 550000
Freq: 500000
Replacing MINFREQ with 500000
Freq: 250000
Replacing MINFREQ with 250000
Freq: 125000
Replacing MINFREQ with 125000
Freq:
: integer expression expected
问题是最后一行由于某种原因是空的或包含空格(我不知道为什么)。我尝试测试是否设置了变量:if [-n“$ freq”]但是这个测试似乎在这里没有用,它仍然会通过最后一行的if语句。
有人可以帮我弄清楚上次循环执行的原因,$ freq设置为空或空格以及如何避免这种情况?
编辑:
using od -c feeded with echo "<<$freq>>"
0000000 < < 8 0 0 0 0 0 > > \n
0000013
0000000 < < 7 0 0 0 0 0 > > \n
0000013
0000000 < < 6 0 0 0 0 0 > > \n
0000013
0000000 < < 5 5 0 0 0 0 > > \n
0000013
0000000 < < 5 0 0 0 0 0 > > \n
0000013
0000000 < < 2 5 0 0 0 0 > > \n
0000013
0000000 < < 1 2 5 0 0 0 > > \n
0000013
0000000 < < \r > > \n
0000006
似乎有一个额外的\ r \ n(来自文件)。
非常感谢!
答案 0 :(得分:2)
如果您只使用整数值,则可以使用正则表达式验证字符串:
elif [[ $freq =~ ^[0-9]+$ && $MINFREQ -gt $freq ]]
答案 1 :(得分:0)
对于错误问题:$FREQUENCIES
中可能有一些额外的空格?
awk
echo $FREQUENCIES | awk '{min=$1;for (i=1;i++;i<=NF) {if ( $i<min ) { min=$i } } ; print min }'
如果它是一个非常长的变量,你可以选择:
echo $FREQUENCIES | awk -v RS=" " 'NR==1 {min=$0} {if ( $0<min ) { min=$0 } } END {print min }'
(它将记录分隔符设置为空格,然后在第一个记录上将min
设置为值,然后为每个记录检查它是否小于min
并最终打印它。
HTH
答案 2 :(得分:0)
如果你正在使用bash,你有算术表达式和“if unset:use value and assign”参数替换:
#!/bin/bash
for freq in "$@"; do
(( minfreq = freq < ${minfreq:=freq} ? freq : minfreq ))
done
echo $minfreq
使用:
./script 800000 700000 600000 550000 500000 250000 125000
答案 3 :(得分:0)
数据: 10, 10.2, -3, 3.8, 3.4, 12
最低限度:
echo -e“10 \ n10.2 \ n-3 \ n3.8 \ n3.4 \ n12”| sort -n |头-1
输出:-3
最高:
echo -e“10 \ n10.2 \ n-3 \ n3.8 \ n3.4 \ n12”| sort -nr |头-1
输出:12
如何? :
1。逐行打印
2.对数字进行排序(反向获取最大值)
3。单独打印第一行。
简单!!
这可能不是一个好方法。但对学习者来说很容易。我确定。
答案 4 :(得分:0)
echo $FREQUENCIES | awk '{for (;NF-1;NF--) if ($1>$NF) $1=$NF} 1'