首页 > 解决方案 > 特定位置/列的数字排序 + 保存前列的“经典”排序

问题描述

这是我拥有的文件示例:

C;S;tous;PMJ100;1;40;1

C;S;tous;PMJ100;1;40;11

C;S;tous;PMJ100;1;40;2

C;S;tous;PMJ100;1;60;1

C;S;tous;PMJ200;1;40;1

(其他一些文件有数千行!)

我想要的只是最后一列进行数字排序,如 1 2 ... 9 10 11 等,但它必须将原始的“经典”排序保存在前 6 列上!所以结果应该是:

C;S;tous;PMJ100;1;40;1

C;S;tous;PMJ100;1;40;2

C;S;tous;PMJ100;1;40;11

C;S;tous;PMJ100;1;60;1

C;S;tous;PMJ200;1;40;1

尽我所能,并没有在谷歌上找到任何有用的东西:(

(注意:空行仅用于在 stackoverflow 上正确显示)

Thx提前寻求帮助!

标签: linuxsortingunix

解决方案


所以你可以使用这个脚本:

#!/bin/bash

# Attention!
if [ -f tosort.tmp ]
then
    rm tosort.tmp
fi


if [ -f tosort_done.tmp ]
then
    rm tosort_done.tmp
fi


if [ -f result.out ]
then
    rm result.out
fi


# And a data file must contain a last "end" line.



nosort_previous_symb=""

while read line_data
do

    tosort_symb=`echo $line_data | rev | cut -d";" -f1-1 | rev`
    nosort_symb=`echo $line_data | rev | cut -d";" -f2- | rev`


    if [[ "$nosort_previous_symb" == "" || "$nosort_previous_symb" == "$nosort_symb"  ]]
    then

        echo $tosort_symb >> tosort.tmp

        #refresh nosort_symb
        nosort_previous_symb="$nosort_symb"


    else


        #old nosort_symb to out
        cat tosort.tmp | sort -nk 1 >  tosort_done.tmp

        while read tosort_symb_done
        do

            echo ""$nosort_previous_symb";"$tosort_symb_done"" >> result.out

        done < tosort_done.tmp


        # new nosort
        echo $tosort_symb > tosort.tmp


        #refresh no sort
        nosort_previous_symb="$nosort_symb"

    fi  


done < data


# Attention!    
rm -f *.tmp


exit

将例如“end”添加到您的数据文件中以使用:

C;S;tous;PMJ100;1;40;1
C;S;tous;PMJ100;1;40;11
C;S;tous;PMJ100;1;40;2
C;S;tous;PMJ100;1;60;1
C;S;tous;PMJ200;1;40;1
end

结果:

C;S;tous;PMJ100;1;40;1
C;S;tous;PMJ100;1;40;2
C;S;tous;PMJ100;1;40;11
C;S;tous;PMJ100;1;60;1
C;S;tous;PMJ200;1;40;1

推荐阅读