2010-02-22 47 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' 

它假定原始文件中没有空行,因为它在最后删除它们。它也依赖于每一组结束行以“]”结尾。