2017-10-21 213 views
1

我尝试过某种检查,但无法找到解决此问题的方法。我认为我应该找到合适的分隔符,然后按数字排序,但它不起作用。在文本字符串中对数字进行排序

这是我的文件:

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 

回答

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 

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

+1

感谢你很多 它的完美的工作! – Lucil120

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与前一行中设置的键匹配,则将该记录推入数组,其中索引在数组中将成为字段8的值,根据此值对结果进行排序。无论$8中的位数是多少,这都可以工作。

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

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

0
sort -V file 

-V,--version排序 自然排序(版本)号的文本中

+0

我找不到关于排序-V的任何信息排序的手册: – Lucil120

+0

这就是我引用该信息的原因。 – thanasisp

相关问题