awk - 用awk对多行记录进行排序

标签 awk text-processing

我有一个记录如下的文件:

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/

相关文章:

php - 如何解析 Linux shell 的长输出( "not text-processing friendly")?

awk - 更改文件名的脚本

shell - 如何从单个文件中 grep 两列

php - 在 PHP 中将 UpperCase CamelCase 分解为 Upper Case Camel Case

linux - 将 csv 中的文本拆分为不同的列

linux - 比较两个 excel 表并打印差异?

bash:我如何连接两个命令的输出以便我可以将它们传递给第三个命令?

text - 使用 awk 或 sed 在但不包括页眉和页脚之间获取文本

variables - 在 awk 中取消引用变量