如何按数字+字符排序字符串?目录列表排序去重求助
解决sort排序不符合预期的问题
你的核心问题在于默认的数字排序(-n)无法识别500kstp、1mstp这类字符串里的单位含义——sort -nk1会把第一列里的第一个连续数字(500 vs 1)作为排序依据,自然会把500kstp排在1mstp后面,但你实际需要的是按500k < 1m < 1.5m < 2m < 30m的逻辑排序(因为1m=1000k)。
下面提供两种可靠的解决方案:
方案一:用awk转换为统一数值后排序(最精准)
先完成去重,再用awk提取关键部分并转换为可排序的数值,最后排序并还原原内容:
# 先按第4-6列去重,再处理排序 sort -unk 4,6 foo.dat | awk -F'/' '{ # 提取路径中的关键段(比如500kstp、1mstp) seg = $3 # 分割出数字部分 split(seg, num_part, /[a-z]/) value = num_part[1] # 单位转换:m是k的1000倍 if (seg ~ /mstp/) value *= 1000 # 输出排序键+原行 print value "\t" $0 }' | sort -nk1 | cut -f2- > boo.dat
这个方法的优势是完全自定义排序逻辑,不管后续出现200kstp还是3.2mstp都能精准排序。
方案二:用GNU sort的版本排序(更简洁)
如果你的系统是GNU sort(大部分Linux发行版默认都是),可以用-V选项(版本排序),它能自动识别数字+单位的排序逻辑:
sort -unk 4,6 foo.dat | sort -V -k1.5,1 > boo.dat
这里-k1.5,1表示从第一列的第5个字符开始排序(跳过路径开头的..../),-V会自动解析500k < 1m < 1.5m这类顺序,非常简洁。
为什么你的原命令不行?
你原命令里的sort -nk1是按第一列的首个连续数字排序,它只会看到500和1,自然把500kstp排在1mstp后面,完全忽略了k和m的单位差异,这就是不符合预期的根本原因。
内容的提问来源于stack exchange,提问作者Leon WANG
相关产品推荐
相关产品推荐

