如何获取bash中每条记录的最小值和最大值

时间:2016-04-08 14:38:15

标签: linux bash unix redhat

我有一个看起来像这样的文件(假设它是使用sort命令排序的)

  

1234 00:00:01
  1234 00:00:02
  1234 00:00:03
  1235 00:10:00
  1235 00:10:12
  1235 00:10:15
  1236 00:12:01
  1236 00:12:05

我想获得每条记录的最小值和最大值,因此输出应该是这样的。

  

1234 00:00:01
  1234 00:00:03
  1235 00:10:00
  1235 00:10:15
  1236 00:12:01
  1236 00:12:05

我可以通过做一些事情来做到这一点,比如首先从最高到最低排序并获得第一个唯一值以获得最高值,并将其再次升序排序以获得下次最低值,并结合记录,是否有更快的速度这样做的方式?

2 个答案:

答案 0 :(得分:1)

awk救援!

$ awk '!($1 in min){min[$1]=max[$1]=$2} 
         min[$1]>$2{min[$1]=$2} 
         max[$2]<$2{max[$1]=$2} 
                END{for(k in min) {print k,min[k]; print k,max[k]}}' file

1234 00:00:01
1234 00:00:03
1235 00:10:00
1235 00:10:15
1236 00:12:01
1236 00:12:05

替代sort

$ (sort -k2 file | sort -uk1,1 && sort -k2r file | sort -uk1,1) | 
  sort

1234 00:00:01
1234 00:00:03
1235 00:10:00
1235 00:10:15
1236 00:12:01
1236 00:12:05

或者,没有最终的排序

paste -d'\n' <(sort -k2 file | sort -uk1,1) <(sort -k2r file | sort -uk1,1)

另一种主要排序方式(两种独特的排序,但速度更快)

sort -k2 file | tee >(sort -uk1,1) >(tac | sort -uk1,1) >/dev/null | paste -d'\n'

答案 1 :(得分:1)

使用sort,awk以及在更改已排序文件中的键时发生前一个最大值和下一个最小值的观察结果:

awk 'prevKey != $1 { print prevLine 
                     print $0 
                     prevKey = $1  } 
                   { prevLine = $0 } 
     END           { print $0 }
    ' <( sort -n yourfile )