【问题标题】:Print greater and lesser number in a file在文件中打印更大和更少的数字
【发布时间】:2021-08-13 00:02:06
【问题描述】:
function greater {
  grep -Eo '[0-9]*' $1 | sort -rn | head -n 1
}

function lesser {
  grep -Eo '\-[0-9]*' $1 | sort -n | head -n 1
}

我已经创建了这些函数,但是正在打印负数:第一个函数忽略了 - 符号,所以它显示了最大的数字,但它应该打印最大的正数。关于如何解决这个问题的任何想法?

示例输入:

-100 -90 95
10 -20
500 400 300 200 600

示例输出:

Greater: 600
Lesser: -100

(较小的工作正常。)

【问题讨论】:

  • grep -Eo -- '-?[0-9]*' $1 | sort -n | tail -n 1grep -Eo -- '-?[0-9]*' $1 | sort -n | head -n 1?

标签: shell sorting awk grep


【解决方案1】:

我建议不要使用两次grep + sort | head,而是使用gnu awk 并在一个命令中同时获取maxmin 会更有效:

awk -v RS='[[:space:]]+' '
NR==1 {max=min=$1}
$1 > max {max=$1}
min > $1 {min=$1}
END {print "max=" max, "min=" min}' file

max=600 min=-100

file 数据在哪里:

cat file

-100 -90 95
10 -20
500 400 300 200 600

或使用任何版本awk:

tr '[[:blank:]]' '\n' < file |
awk 'NR==1{max=min=$1} $1 > max {max=$1} min > $1 {min=$1} END {print "max=" max, "min=" min}'

【讨论】:

  • 我见过一些类似的例子,但它只适用于单列 ($1)。但这些数字可能不止一列,因此该代码对我不起作用。
  • 嘿,我尝试在一个只有两个数字的文件中使用相同的数字,而较小的则什么也不打印。为什么?
  • min 需要更正,请检查编辑后的答案
【解决方案2】:

使用您展示的示例,您也可以尝试关注。简单的解释是;使用 xargs 打印 1 列中的所有元素,然后将其作为标准输入传递给 awk,通过在程序的 END 块处读取整个 Input_file 来查找最小值和最大值,并在此处打印两个值。

xargs -n1 < Input_file | awk 'FNR==1{max=min=$0} max>$0{max=$0} min<$0{min=$0} END{print max,min}'

上面从 Input_file 中读取值,以防您想从 shell 变量中读取它,然后尝试以下操作(其中 var 是 shell 变量):

xargs -n1  <<< "$var" | awk 'FNR==1{max=min=$0} max>$0{max=$0} min<$0{min=$0} END{print max,min}'

【讨论】:

    【解决方案3】:

    单独使用任何 awk:

    awk '
        NR==1 { min=max=$1 }
        { for (i=1; i<=NF; i++) {if ($i<min) min=$i; if (max<$i) max=$i} }
        END { printf "Greater: %d\nLesser: %d\n", max, min }
    ' file
    Greater: 600
    Lesser: -100
    

    带有%d 的 printfs 确保即使输入文件为空,您也会得到数字输出。

    【讨论】:

      【解决方案4】:

      扩展你的方法

      $ tr -s ' ' \\n <file | sort -n | sed -n '1s/.*/min: &/p;$s/.*/max: &/p'
      
      min: -100
      max: 600
      

      【讨论】:

        猜你喜欢
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        相关资源
        最近更新 更多