【问题标题】:Finding the max and min values and printing the line from a file查找最大值和最小值并从文件中打印该行
【发布时间】:2013-04-19 05:01:39
【问题描述】:

我有一个第一列有数字的文件。

100,red
101,blue
102,black

我应该编写一个 shell 脚本,它将打印带有最大和最小数字的行。

max=0
cat file.txt|while read LINE
do
    fir=`echo $LINE|awk '{print $2}'`
    sec=`echo $LINE|awk '{print $3}'`
    if [ $fir -gt $max ]; then
       max=$fir
    fi
    if [ $sec -gt $max ];then
        max=$sec
    fi
done

grep $max file.txt

这是我迄今为止为找到最大值所做的尝试。

【问题讨论】:

  • 一种非常“昂贵”的方式来解析你的行,你为什么要查看 ...awk '{print $3}' ...你只有 2 个元素? @sudo_O 是对的,这里最好使用 awk,但是如果您只是想学习 shell 编码,那么请将其减少到 while read fir sec ; do if [ $fir .... done < file.txt 。祝你好运。
  • max 被设置在管道诱导的子外壳中。只需更改为while read LINE; do ...; done < file.txt。但正如其他人指出的那样,这非常昂贵。
  • 你应该写一个shell脚本吗?这是作业吗?

标签: linux bash shell unix awk


【解决方案1】:

对于最小值:

[bash]$ cut -f1 -d"," file_name | sort -n | head -1

对于最大值:

[bash]$ cut -f1 -d"," file_name | sort -n | tail -1

【讨论】:

  • 这个解决方案有效,但排序不是比仅仅找到最小值( O (log n) )更昂贵( O(n log n) )吗?有没有更有效的方法?
  • 嗨,你可以试试这个:awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' 文件名
【解决方案2】:

或者使用 sort 和 sed

$ sort -n id | sed -n '1p;$p'
100 red
102 black

-n 标志 - 按数字排序。

使用方法:

$ a=($(sort -n id | sed -n '1s/^\([0-9]\+\).*$/\1/p;$s/^\([0-9]\+\).*$/\1/p'))
$ echo "min=${a[0]}, max=${a[1]}"
min=100, max=102

【讨论】:

  • 这是一个简单而优雅的解决方案!
【解决方案3】:

如果你有GNU awk,你应该在awk 中做所有事情:

$ awk -F, '{a[$1]=$0}END{asorti(a,b);print a[b[1]]"\n"a[b[NR]]}' file
100,red
102,black

如果你不这样做:

$ awk -F, 'NR==1{s=m=$1}{a[$1]=$0;m=($1>m)?$1:m;s=($1<s)?$1:s}END{print a[s]"\n"a[m]}' file
100,red
102,black

或者预排序并打印第一行和最后一行:

$ sort -t',' -nk1 file | awk 'NR==1;END{print}'
100,red
102,black

【讨论】:

  • 谢谢,但我收到“function asorti never defined”错误,我还想打印整行,而不仅仅是数字。
  • 你在什么系统上?你好像没有GNU awk
  • 第二个效果很好,但很抱歉忘记了我在数字和颜色之间有逗号
  • 我喜欢这些解决方案。脚本语言对于日常任务非常方便。我喜欢他们以最小的(代码)开销来测试/原型设计的可用性。
【解决方案4】:
[bash]$ cat log
100,red
101,blue
102,black
[bash]$ all=( $(sort log | cut -f1 -d',') )
[bash]$ echo "MIN: ${all[0]} and MAX: ${all[${#all[@]}-1]}"
MIN: 100 and MAX: 102

使用已排序的元素创建一个数组。第一个和最后一个元素包含最小值和最大值

【讨论】:

  • 您希望在第一个字段sort -t',' -nk1 file 上对数字进行排序。
【解决方案5】:

在 zip CSV 文件中

对于最小值

bzcat file.csv.bz2 | cut -f2 -d";" | sort -n | head -2

求最大值

bzcat file.csv.bz2 | cut -f2 -d";" | sort -n | tail -1

各位,

阿里

【讨论】:

  • 这有什么关系? OP 声明(含蓄地)给了他一个纯文本文件。
猜你喜欢
  • 2014-01-12
  • 2016-06-07
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2014-06-26
  • 2019-05-26
  • 2012-09-14
  • 2015-02-20
相关资源
最近更新 更多