Unix文件按时间戳列排序异常:sort命令未达预期结果求助
问题分析与解决方案
你的问题出在排序列指定错误,同时对sort处理时间格式的逻辑理解有点偏差。咱们一步步来解决:
原命令的问题
你执行的命令是:
sort -k 4 -t " " -n -r txt
这里有两个关键错误:
-k 4表示按第4列排序,但你的文件每行只有2列(第一列是单个字符,第二列是时间戳),所以应该指定第2列(-k 2)。-n是按数字排序,但HH:MM:SS格式里的冒号会破坏数字排序的连续性,虽然你的时间是固定两位的格式,但用默认的字符串排序更直接可靠。
方法1:利用固定格式的字符串排序(简单高效)
因为你的时间是严格的HH:MM:SS两位格式,字符串字典序的比较结果和时间大小的结果是一致的,直接用以下命令即可:
sort -k 2 -r txt
参数解释:
-k 2:指定按第二列(时间戳)排序-r:降序排列- 省略
-n,使用默认的字符串排序逻辑,刚好适配固定长度的时间格式。
执行后就能得到你想要的输出:
N 01:03:02
C 01:02:03
K 01:02:00
A 00:00:01
方法2:转为秒数的数值排序(更严谨,适配非固定格式)
如果你的时间格式可能不固定(比如小时/分钟/秒可能是一位数,比如1:2:3),那么字符串排序就会出错,这时候可以先把时间转为总秒数,按数值排序后再还原:
awk '{split($2, t, ":"); secs = t[1]*3600 + t[2]*60 + t[3]; print secs, $0}' txt | sort -k1 -nr | cut -d' ' -f2-
分步解释:
- awk处理:把第二列的时间按冒号分割成小时、分钟、秒,计算总秒数,把秒数放在行首,再输出原行内容。
- sort排序:按第一列的秒数(数值)降序排序。
- cut还原:去掉行首的秒数,输出原始的字符+时间格式。
这种方法无论时间格式是否固定,都能准确按时间大小排序。
内容的提问来源于stack exchange,提问作者PANDURANG BHADANGE
相关产品推荐
相关产品推荐

