我有一个看起来像这样的文件(假设它是使用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
我可以通过做一些事情来做到这一点,比如首先从最高到最低排序并获得第一个唯一值以获得最高值,并将其再次升序排序以获得下次最低值,并结合记录,是否有更快的速度这样做的方式?
答案 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 )