2017-10-21 117 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

相關問題