在一串文本中对numberic进行排序

时间:2017-10-21 03:34:18

标签: sorting unix awk

我尝试了一些考试,但无法找到解决这个问题的方法。我想我应该找到合适的分隔符,然后用数字排序,但它不能按照我的意愿工作。

这是我的档案:

abc_bla_bla_bla_reg0_bla_reg_1_0 
abc_bla_bla_bla_reg0_bla_reg_5_0 
abc_bla_bla_bla_reg0_bla_reg_2_0 
abc_bla_bla_bla_reg0_bla_reg_10_0 
abc_bla_bla_bla_reg0_bla_reg_15_0
abc_bla_bla_bla_reg2_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_9_0 
abc_bla_bla_bla_reg2_bla_reg_7_0 
abc_bla_bla_bla_reg3_bla_reg_26_0 
abc_bla_bla_bla_reg3_bla_reg_3_0
abc_bla_bla_bla_reg3_bla_reg_5_0

这是我渴望的结果:

abc_bla_bla_bla_reg0_bla_reg_1_0
abc_bla_bla_bla_reg0_bla_reg_2_0
abc_bla_bla_bla_reg0_bla_reg_5_0
abc_bla_bla_bla_reg0_bla_reg_10_0
abc_bla_bla_bla_reg0_bla_reg_15_0
abc_bla_bla_bla_reg2_bla_reg_7_0
abc_bla_bla_bla_reg2_bla_reg_9_0
abc_bla_bla_bla_reg2_bla_reg_15_0
abc_bla_bla_bla_reg3_bla_reg_3_0
abc_bla_bla_bla_reg3_bla_reg_5_0
abc_bla_bla_bla_reg3_bla_reg_26_0

3 个答案:

答案 0 :(得分:2)

$ sort -t_ -k5,5 -k8,8n file
abc_bla_bla_bla_reg0_bla_reg_1_0
abc_bla_bla_bla_reg0_bla_reg_2_0
abc_bla_bla_bla_reg0_bla_reg_5_0
abc_bla_bla_bla_reg0_bla_reg_10_0
abc_bla_bla_bla_reg0_bla_reg_15_0
abc_bla_bla_bla_reg2_bla_reg_7_0
abc_bla_bla_bla_reg2_bla_reg_9_0
abc_bla_bla_bla_reg2_bla_reg_15_0
abc_bla_bla_bla_reg3_bla_reg_3_0
abc_bla_bla_bla_reg3_bla_reg_5_0
abc_bla_bla_bla_reg3_bla_reg_26_0

如果第5列中的regN值可以包含2位数字,则可能产生或不产生您期望的输出。

答案 1 :(得分:0)

使用 awk

$awk -F"_" 'function print_array(arr,max){ for(i=1; i<=max; i++) if(a[i]){print a[i], a[i]="";} } key==$5{a[$8]=$0; key=$5; max=$8>max?$8:max} key!=$5{print_array(a,max); key=$5; a[$8]=$0; max=$8} END{print_array(a,max)}' file

<强>输出

abc_bla_bla_bla_reg0_bla_reg_1_0  
abc_bla_bla_bla_reg0_bla_reg_2_0  
abc_bla_bla_bla_reg0_bla_reg_5_0  
abc_bla_bla_bla_reg0_bla_reg_10_0  
abc_bla_bla_bla_reg0_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_7_0  
abc_bla_bla_bla_reg2_bla_reg_9_0  
abc_bla_bla_bla_reg2_bla_reg_15_0  
abc_bla_bla_bla_reg3_bla_reg_3_0 
abc_bla_bla_bla_reg3_bla_reg_5_0 
abc_bla_bla_bla_reg3_bla_reg_26_0

<强>解释

awk -F"_" '
    function print_array(arr,max)    #Simply prints the hashed array from i=1 to max value array is holding
    { 
        for(i=1; i<=max; i++) 
        if(a[i])
            {print a[i], a[i]="";} 
    } 

    key==$5{a[$8]=$0; max=$8>max?$8:max} #Key here denotes the 5th field for eg. reg0 in line one. Initially key is null and it will satisfy the condition mentioned below i.e key!=$5. If the 5th field matches with the key set in previous line then push the record into array where the index in array will be the value at field 8 based on which you want to sort your results. 

    key!=$5{print_array(a,max); key=$5; a[$8]=$0; max=$8} #If key doesn't matches the 5th line it signifies we have a new record set and before proceeding further print the array we stored for previous record set based on 5th field.

    END{print_array(a,max) #To print the last record set

    }' file

key==$5{a[$8]=$0; max=$8>max?$8:max}Key这里表示例如第5个字段。第一行reg0。最初key为空,它将满足下面提到的条件,即key!=$5。如果第5个字段$5与上一行中设置的键匹配,则将记录推送到数组,其中数组中的索引将是字段8中的值,您希望根据该值对结果进行排序。无论$8中的位数如何,这都可以。

key!=$5{print_array(a,max); key=$5; a[$8]=$0; max=$8}如果key与第5行不匹配,则表示我们有新的记录集,然后再继续打印我们为基于第5个字段的先前记录集存储的数组。< / p>

END{print_array(a,max)只是打印最后一个记录集

答案 2 :(得分:0)

sort -V file
  

-V, - version-sort                 文本中的自然种类(版本)