求助:按混合格式日期字段对文本文件排序
解决混合日期格式的文本排序问题
你的sort命令无法生效,核心问题是日期字段存在**两位年份(如13、14)和四位年份(如2013)**的混合格式,原命令中-k 4.8,4.11仅能匹配四位年份的字段,两位年份的位置完全不对应,导致排序逻辑混乱。
以下是两种可行的解决方法:
方法一:用awk统一日期格式后排序
先通过awk将所有日期的年份转换为四位格式,再执行排序:
awk -F '+' '{ split($4, d, "/"); if (length(d[3]) == 2) d[3] = "20" d[3]; $4 = d[1] "/" d[2] "/" d[3]; print $0 }' Test.txt | sort -t '+' -k 4.8,4.11 -k 4.4M -k 4.1,4.2 -b
逻辑说明:
- 以
+为分隔符拆分每行内容,提取第四个字段(日期) - 将日期按
/拆分为月、日、年三个部分 - 判断年份长度,若为两位则自动补全为
20xx格式 - 重新组合日期字段后输出,再用你原本的sort规则排序
方法二:用sed预处理日期后排序
通过sed正则替换,直接将两位年份转换为四位,再执行排序:
sed 's/\(\/[0-9][0-9]\)$/\/20\1/' Test.txt | sort -t '+' -k 4.8,4.11 -k 4.4M -k 4.1,4.2 -b
逻辑说明:
- 正则匹配每行末尾的
/xx格式两位年份,替换为/20xx - 统一年份格式后,原sort命令即可正常按年、月、日的顺序排序
最终排序结果:
Canada Goose + 1x03 + For the Triumph of Evil + Sep/30/2013
New Family + 3x03 + Double Date + Oct/01/2013
Rucksack + 10x03 + Everybody's Crying Mercy + Oct/03/2013
Test + 4x01 + Season 4, Episode 1 + Jun/01/2014
内容的提问来源于stack exchange,提问作者Khaled Fayala
相关产品推荐
相关产品推荐

