Linux数字排序结果出现行错位,求解决方法
问题修正:按指定列数字排序时字段错位的解决方法
你遇到的问题根源是队名字段包含空格:执行sed "s/:/ /g"将所有冒号替换为空格后,原本的3列数据(SQUADRA、CATEGORIA、PUNTEGGIO)被拆分成了更多字段,导致sort -nrk 3实际是按非数字的字段(比如Serie)排序,完全偏离了按PUNTEGGIO列排序的预期。
方案1:保留冒号分隔符排序(最简便)
直接保留cut后的冒号分隔格式,排序时指定分隔符为冒号,避免字段内空格干扰列的识别:
cut -d: -f2,3,5 Citta.txt | (sed -u 1q; sort -t: -nrk3)
命令解释:
cut -d: -f2,3,5:提取第2、3、5列,用冒号作为分隔符sed -u 1q:保留第一行表头不参与排序sort -t: -nrk3:指定冒号为字段分隔符,按第3列(PUNTEGGIO)数字逆序排序
执行后输出符合预期:
SQUADRA:CATEGORIA:PUNTEGGIO ASP:U18F:24 Tarquinia:U16F:22 VBC Viterbo:U12F:18 Montalto Montaggi:Serie DM:17 Montefiascone:U19M:00
方案2:输出用空格分隔(如需格式化输出)
如果希望最终输出用空格分隔字段,可以用awk处理,它能正确识别包含空格的字段:
awk -F: ' NR==1 {print $2, $3, $5; next} {arr[$5] = $2 " " $3 " " $5} END { PROCINFO["sorted_in"] = "@val_num_desc" for (score in arr) print arr[score] } ' Citta.txt
效果:
表头和数据行用空格分隔,同时保证按PUNTEGGIO数字逆序排序:
SQUADRA CATEGORIA PUNTEGGIO ASP U18F 24 Tarquinia U16F 22 VBC Viterbo U12F 18 Montalto Montaggi Serie DM 17 Montefiascone U19M 00
内容的提问来源于stack exchange,提问作者Flavio Costa
相关产品推荐
相关产品推荐

