如何仅使用Bash按时间戳对文件内的文本行进行排序并写入新文件
方案1:基于时间戳转换的排序(通用性更强,推荐)
该方法会先将每行的日期时间转为Unix时间戳,按时间戳排序后剔除临时字段,不会受时间、日期的位数格式影响,容错率更高:
# input.txt替换为你的源文件名,sorted_output.txt替换为目标文件名 while IFS= read -r line; do datetime_part=$(echo "$line" | awk '{print $2" "$1}') ts=$(date -d "$datetime_part" +%s 2>/dev/null) echo "$ts $line" done < input.txt | sort -n | cut -d ' ' -f2- > sorted_output.txt
注意:如果你的日期格式为
日/月/年而非默认的月/日/年,调整date命令的格式适配参数即可。
方案2:直接多字段排序(效率更高,适合大文件)
如果你的文件所有行格式严格统一,可直接用sort命令指定多个排序键完成排序,无需转换时间戳,处理大文件时性能更好:
sort -k2.7,2.8n -k2.1,2.2n -k2.4,2.5n -k1.1,1.2n -k1.4,1.5n input.txt > sorted_output.txt
参数说明:
- 按优先级依次排序:日期的年份(第二字段第7-8位)、月份(第二字段第1-2位)、日期(第二字段第4-5位)、小时(第一字段第1-2位)、分钟(第一字段第4-5位)
- 后缀
n表示按数字类型排序,避免字符排序出现的逻辑错误
同样如果日期为
日/月/年格式,调换月份和日期的排序键顺序即可。
你提供的样例输入执行后,输出的sorted_output.txt内容如下:
1:19 09/01/21 string3 2:19 09/01/21 string2 15:19 09/01/21 string1
内容的提问来源于stack exchange,提问作者SEU
相关产品推荐
相关产品推荐

