2010-02-22 76 views
0

的組I有一個文本文件等下面分揀線

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

9表示由我必須排序 8 ....

我需要一個外殼腳本/ AWK這將在以降序的排序單元的數量。 怎麼可能?

+0

您排序的行會始終與模式'iv_destination_code_ [0-9] +'匹配,還是可以在該數字之前出現任意前綴?另外,是否必須是shell或awk腳本,或者解決方案是否可以使用任何常見的unix腳本語言(tcl,python等)? – 2010-02-22 12:51:56

回答

2
sed 'N;N;s/\n/#/g' file |sort -t"_" -nr -k4 | sed 's|#|\n|g' 

或者與GAWK

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 
3
cat file | tr '\n' '#' | sed 's/]#/]\n/g' | sort -nrt_ -k4 | tr '#' '\n' 

首先線的所有端通過#代替,並且在塊的結尾(]#)線的端部被重新創建。

然後在第四個字段上執行數字反向排序,字段之間用_分隔。

最後,檢索行的原始結尾。

0

這種工作方式類似於mouvicel的答案,但使用非打印字符作爲特殊標記(並假設原始文件不包含它們)。

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

它假定原始文件中沒有空行,因爲它在最後刪除它們。它也依賴於每一組結束行以「]」結尾。