Perl 想知道sed或awk是否可以使用行号重新排序

Perl 想知道sed或awk是否可以使用行号重新排序,perl,awk,sed,Perl,Awk,Sed,我现在有一个这样开头的文本文件 ATOM 277 N DOPC 3 2.637 5.546 17.667 1.00 0.00 MEMB ATOM 278 C12 DOPC 3 2.869 5.398 19.176 1.00 0.00 MEMB ATOM 279 H12A DOPC 3 3.729 6.005 19.418 1.00 0.00 MEMB ATO

我现在有一个这样开头的文本文件

ATOM    277  N   DOPC    3       2.637   5.546  17.667  1.00  0.00      MEMB
ATOM    278  C12 DOPC    3       2.869   5.398  19.176  1.00  0.00      MEMB
ATOM    279 H12A DOPC    3       3.729   6.005  19.418  1.00  0.00      MEMB
ATOM    280 H12B DOPC    3       3.176   4.394  19.427  1.00  0.00      MEMB
ATOM    281  C13 DOPC    3       1.352   4.873  17.275  1.00  0.00      MEMB
ATOM    282 H13A DOPC    3       1.380   5.091  16.217  1.00  0.00      MEMB
ATOM    283 H13B DOPC    3       1.415   3.810  17.452  1.00  0.00      MEMB
ATOM    284 H13C DOPC    3       0.491   5.261  17.799  1.00  0.00      MEMB
ATOM    285  C14 DOPC    3       3.791   4.845  16.976  1.00  0.00      MEMB
ATOM    286 H14A DOPC    3       4.692   4.989  17.554  1.00  0.00      MEMB
ATOM    287 H14B DOPC    3       3.563   3.790  17.025  1.00  0.00      MEMB
ATOM    288 H14C DOPC    3       3.875   5.097  15.930  1.00  0.00      MEMB
ATOM    289  C15 DOPC    3       2.627   6.991  17.324  1.00  0.00      MEMB
ATOM    290 H15A DOPC    3       1.812   7.530  17.785  1.00  0.00      MEMB
.
.
我想知道是否有任何方法可以使用sed或awk来重新排序这些行,从而使排序从[1,2,3…14…]到[1,2,5,9,13,3,4,6,7,8,10,11,12,14…],只需使用它们唯一的行号就可以了

这是所需的输出

ATOM    277  N   DOPC    3       2.637   5.546  17.667  1.00  0.00      MEMB
ATOM    278  C12 DOPC    3       2.869   5.398  19.176  1.00  0.00      MEMB
ATOM    281  C13 DOPC    3       1.352   4.873  17.275  1.00  0.00      MEMB
ATOM    285  C14 DOPC    3       3.791   4.845  16.976  1.00  0.00      MEMB
ATOM    289  C15 DOPC    3       2.627   6.991  17.324  1.00  0.00      MEMB
ATOM    279 H12A DOPC    3       3.729   6.005  19.418  1.00  0.00      MEMB
ATOM    280 H12B DOPC    3       3.176   4.394  19.427  1.00  0.00      MEMB
ATOM    284 H13C DOPC    3       0.491   5.261  17.799  1.00  0.00      MEMB
ATOM    286 H14A DOPC    3       4.692   4.989  17.554  1.00  0.00      MEMB
ATOM    287 H14B DOPC    3       3.563   3.790  17.025  1.00  0.00      MEMB
ATOM    288 H14C DOPC    3       3.875   5.097  15.930  1.00  0.00      MEMB
ATOM    290 H15A DOPC    3       1.812   7.530  17.785  1.00  0.00      MEMB
.
.
谢谢

在awk中:

$ awk -v order="1,2,5,9,13,3,4,6,7,8,10,11,12,13,14" '{
    a[NR]=$0              # hash records to a with NR as index
}
END { 
    n=split(order,o,/,/)  # split the given order to a mapping
    for(i=1;i<=n;i++) {   # iterate the map indexes
        print a[o[i]]     # output
        # delete a[o[i]]  # uncomment these
    }
    # for(i=1;i<=NR;i++)  # to print any leftovers
    #     if(i in a)      # that were not in the order list
    #         print a[i]
}' file
$awk-v order=“1,2,5,9,13,3,4,6,7,8,10,11,12,13,14”{
a[NR]=$0#将记录散列到a,并将NR作为索引
}
结束{
n=拆分(顺序,o,/,/)#将给定顺序拆分为映射

对于(i=1;i使用以下Perl一行程序:

perl -ne 'push @a, $_; END { print $a[$_-1] for ( 1,2,5,9,13,3,4,6,7,8,10,11,12,13,14, 15..($#a+1) ); }' in_file > out_file
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-n
:在输入上一次循环一行,默认情况下将其分配给
$\uu

push@a,$\code>:将当前行作为下一个元素添加到数组
@a
(最初为空)。
$#a
:数组的最后一个元素的索引
@a


END{…}
:读取所有输入行后,在块内执行代码。在这里,按指定顺序打印行。

您的问题不清楚,请添加希望获得输出的逻辑。此外,请添加您的努力,这是非常鼓励的,以及问题中代码标记中的输出示例。嗯,这会产生f输出错误。哦,是的,您的订单有13个两次。谢谢!对不起,额外的13个是输入错误。我已经更正了,对不起!