Я попробовал что-то вроде экзамена, но не могу найти способ решить эту проблему. Я думаю, что я должен найти правильный разделитель, а затем отсортировать его по числовому, но это не работает как мое желание

Это мой файл .

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
0
Lucil120 21 Окт 2017 в 06:34

3 ответа

Лучший ответ
$ 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-значные числа.

2
Ed Morton 21 Окт 2017 в 04:07
sort -V file

-V, --version-сортировать натуральный вид (версии) чисел в тексте

0
thanasisp 21 Окт 2017 в 23:24

Использование 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-го поля.

END{print_array(a,max) Просто напечатать последний набор записей

0
Rahul Verma 21 Окт 2017 в 13:57