сортировка группы строк - PullRequest
       6

сортировка группы строк

0 голосов
/ 22 февраля 2010

У меня есть текстовый файл, как показано ниже

iv_destination_code_10
TAP310_mapping_RATERUSG_iv_destination_code_10
RATERUSG.iv_destination_code_10 = WORK.maf_feature_info[53,6]
iv_destination_code_2
TAP310_mapping_RATERUSG_iv_destination_code_2
RATERUSG.iv_destination_code_2 = WORK.maf_feature_info[1,6]
iv_destination_code_3
TAP310_mapping_RATERUSG_iv_destination_code_3
RATERUSG.iv_destination_code_3 = WORK.maf_feature_info[7,6]
iv_destination_code_4
TAP310_mapping_RATERUSG_iv_destination_code_4
RATERUSG.iv_destination_code_4 = WORK.maf_feature_info[13,6]
iv_destination_code_5
TAP310_mapping_RATERUSG_iv_destination_code_5
RATERUSG.iv_destination_code_5 = WORK.maf_feature_info[19,6]
iv_destination_code_6
TAP310_mapping_RATERUSG_iv_destination_code_6
RATERUSG.iv_destination_code_6 = WORK.maf_feature_info[29,6]
iv_destination_code_7
TAP310_mapping_RATERUSG_iv_destination_code_7
RATERUSG.iv_destination_code_7 = WORK.maf_feature_info[35,6]
iv_destination_code_8
TAP310_mapping_RATERUSG_iv_destination_code_8
RATERUSG.iv_destination_code_8 = WORK.maf_feature_info[41,6]
iv_destination_code_9
TAP310_mapping_RATERUSG_iv_destination_code_9
RATERUSG.iv_destination_code_9 = WORK.maf_feature_info[47,6]

комбинация из трех строк образует единицу:

    iv_destination_code_9
    TAP310_mapping_RATERUSG_iv_destination_code_9
    RATERUSG.iv_destination_code_9 = WORK.maf_feature_info[47,6]

это одна единица.

iv_destination_code_9

9 указывает число, по которому я должен сортировать 10 9 8 ....

Мне нужен скрипт оболочки / awk, который будет сортировать единицы в порядке убывания. как это возможно?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2010
cat file | tr '\n' '#' | sed 's/]#/]\n/g' | sort -nrt_ -k4 | tr '#' '\n'

Сначала все конец строк заменяются на #, а конец строк в конце блоков (]#) воссоздается.

Затем в четвертом поле выполняется числовая обратная сортировка с полями, разделенными _.

Наконец, получается исходный конец строк.

2 голосов
/ 22 февраля 2010
sed 'N;N;s/\n/#/g' file |sort -t"_" -nr -k4 | sed 's|#|\n|g'

Или с глазком

awk -vRS="\niv_" -vFS="\n" 'BEGIN{t=0}
{
 m=split($1,a,"_")
 num[a[m]]
 line[a[m]] = $0
}
END{
 cmd="sort -nr"
 for(i in num){ print i |& cmd }
    close(cmd,"to")
    while((cmd |& getline m) > 0) {
        z=split(m,arr2,"\n")
    }
    close(cmd,"from")
 print line[ arr2[1] ]
 for(j=2;j<=z;j++){
    if(line[ arr2[j]] != "" ){
        print "iv_"line[ arr2[j] ]
    }
 }
}' file
0 голосов
/ 22 февраля 2010

Это работает аналогично ответу mouvicel , но использует непечатаемые символы в качестве специальных маркеров (и предполагает, что исходный файл не содержит их).

sed 's/]$/]'$'\1''/' text_file | tr '\1' '\0' | sort -znrt_ | tr '\0' '\n' | sed '/^$/d'

Предполагается, что в исходном файле нет пустых строк, поскольку он удаляет их в конце. Он также полагается на то, что каждая строка, заканчивающаяся группой, заканчивается на «]».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...