有人可以告诉我一种使用 awk、sed 或某种 unix shell 程序找到最大正数的方法吗?我正在使用 Linux RHEL 和 KSH。输入可能有 8 列数据,其中 N/A 作为可能值之一。
SAMPLE INPUT
1252.2 1251.8 N/A N/A
-31.9 -33.2 N/A N/A
-1172.4 -1174.4 N/A N/A
-6.5 -6.4 N/A N/A
-.3 -.3 N/A N/A
1351.8 1351.8 N/A N/A
38.3 38.0 N/A N/A
-21.6 -21.9 N/A N/A
-4.7 -4.5 N/A N/A
-5.0 -2.9 N/A N/A
3.1 3.3 N/A N/A
-20.1 -20.3 N/A N/A
-199.1 -199.3 N/A N/A
346.5 346.7 N/A N/A
-.8 -.4 N/A N/A
14.8 14.7 N/A N/A
8.4 8.4 N/A N/A
-18.2 -18.2 N/A N/A
-43.7 -43.6 N/A N/A
所需输出
Largest number is 1351.8
答案1
使用 Awk,强制对N/A
条目进行数值计算:
awk '{for (i=1;i<=NF;i++) max = $i+0 > max ? $i : max} END{print "Largest number is " max}' data
答案2
一种方法可以是:
perl -lane '$_>$m and $m=$_ for @F}{print $m' sample.txt
解释:
-n
选项将按行处理您的输入文件。-e
选项会将其后面的 Perl 代码应用于读取的每一行输入。-a
选项将在读入各个字段时将每一行拆分并将它们存储在数组中@F
。-l
选项将使 RS=ORS="\n"for @F
将循环遍历每个字段,当前字段保存在$_
.我们将当前字段与最大值进行比较,如果它超过最大值,则更新最大值。
当我们完成比较后,}{我们打印 max 中的内容。
在数字上下文中s
N/A
应被视为 0,因此不会影响结果,除非所有数字一开始都是负数。
答案3
tr
使用,sort
和 的bash 风格的解决方案head
echo $(< file) | tr ' ' '\n' | sort -rn | head -1
echo $(< file)
读取文件并回显结果。但由于我们没有在它周围加引号(echo "$(< file)"
与 相同cat file
),内容是一个长字符串,删除了换行符并压缩了空格| tr ' ' '\n'
tr
通过用换行符替换每个空格字符来传递结果| sort -rn
将结果通过管道传递给sort
,以相反的 (-r) 数字 (-n) 顺序对所有行进行排序(最大的数字在前)| head -1
将结果通过管道输出head
到输出第一行
答案4
我已经通过下面的方法命令完成了
awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}'
输出
awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}'
输出
1351.8