我有一个记录如下的文件:
nad9
abie_by_ctai_prots contig_4729 808, 1393 1,196 abie_by_ctai_prots_1_196
abie_by_wmir_prots contig_4729 811, 1363 2,187 abie_by_wmir_prots_2_187
abie_by_gbil_prots contig_4729 808, 1393 1,196 abie_by_gbil_prots_1_196
abie_by_atha_prots contig_4729 808, 1363 1,186 abie_by_atha_prots_1_186
ND2
abie_by_ctai_prots contig_1280 9618, 11661 0,182 abie_by_ctai_prots_0_182
abie_by_ctai_prots contig_9528 770, 959 427,490 abie_by_ctai_prots_427_490
abie_by_ctai_prots contig_6628 5874, 2217 182,429 abie_by_ctai_prots_182_429
ccmB
abie_by_ctai_prots contig_334 39851, 39218 0,212 abie_by_ctai_prots_0_212
abie_by_wmir_prots contig_334 39842, 39218 2,211 abie_by_wmir_prots_2_211
abie_by_gbil_prots contig_334 39851, 39218 0,212
我想根据基因名称(记录的第一行)对记录进行排序。
输出应如下所示:
ND2
abie_by_ctai_prots contig_1280 9618, 11661 0,182 abie_by_ctai_prots_0_182
abie_by_ctai_prots contig_9528 770, 959 427,490 abie_by_ctai_prots_427_490
abie_by_ctai_prots contig_6628 5874, 2217 182,429 abie_by_ctai_prots_182_429
ccmB
abie_by_ctai_prots contig_334 39851, 39218 0,212 abie_by_ctai_prots_0_212
abie_by_wmir_prots contig_334 39842, 39218 2,211 abie_by_wmir_prots_2_211
abie_by_gbil_prots contig_334 39851, 39218 0,212 abie_by_gbil_prots_0_212
nad9
abie_by_ctai_prots contig_4729 808, 1393 1,196 abie_by_ctai_prots_1_196
abie_by_wmir_prots contig_4729 811, 1363 2,187 abie_by_wmir_prots_2_187
abie_by_gbil_prots contig_4729 808, 1393 1,196 abie_by_gbil_prots_1_196
abie_by_atha_prots contig_4729 808, 1363 1,186 abie_by_atha_prots_1_186
我试过这段代码没有成功:
vilde$ awk '{ RS = ""; FS = "\n"} {print $0}' |sort filename.txt
它给我的输出看起来类似于:
(empty line)
(empty line)
(empty line)
abie_by_ctai_prots contig_4729 808, 1393 1,196 abie_by_ctai_prots_1_196
abie_by_wmir_prots contig_4729 811, 1363 2,187 abie_by_wmir_prots_2_187
abie_by_gbil_prots contig_4729 808, 1393 1,196 abie_by_gbil_prots_1_196
abie_by_atha_prots contig_4729 808, 1363 1,186 abie_by_atha_prots_1_186
ND2
ccmB
nad9
在我看来,它是按字段而不是记录排序,但我不明白为什么或如何更改它。
最佳答案
问题中的命令行似乎未向 awk
命令提供任何输入,因此您只是对输入文件的各个行进行排序。但是您使用 RS=""
是在正确的轨道上。
据我所知,大多数排序实现不会处理单个记录的多行输入。但是您的记录看起来像 awk
可以很好地处理的那种东西,所以我认为我的方法是使用管道转换记录中的换行符以允许对记录进行排序,然后将它们转换回来排序后。像这样:
$ awk -v RS= '{gsub(/\n/,"#")} 1' input.txt | sort | awk '{gsub(/#/,"\n")} 1'
请注意,这不会在记录之间放置空行。如果您需要这些,请将最后的 1
替换为:{print $0 ORS}
。
关于awk - 用awk对多行记录进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040361/