我有一个如下文本文件
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 ....
我需要一个shell脚本/ awk,它将按降序对单元进行排序。 怎么可能?
答案 0 :(得分:3)
cat file | tr '\n' '#' | sed 's/]#/]\n/g' | sort -nrt_ -k4 | tr '#' '\n'
首先将所有行的末尾替换为#
,并重新创建块末尾的行尾(]#
)。
然后对第四个字段执行数字反向排序,字段以_
分隔。
最后,检索原始行尾。
答案 1 :(得分: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
答案 2 :(得分:0)
这类似于 mouvicel的答案,但使用非打印字符作为特殊标记(并假设原始文件不包含它们)。
sed 's/]$/]'$'\1''/' text_file | tr '\1' '\0' | sort -znrt_ | tr '\0' '\n' | sed '/^$/d'
它假定原始文件中没有空行,因为它最后删除了它们。它还依赖于每个组结束行以“]”结尾。