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

wondering if sed or awk can reorder using line number

我目前有一个这样开头的文本文件,

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]=[=10=]              # 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

使用这个 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 单行代码使用这些命令行标志:
-e : 告诉 Perl 查找内联代码,而不是在文件中。
-n :一次循环输入一行,默认分配给 $_

push @a, $_; :将当前行作为下一个元素添加到数组 @a(最初为空)。
$#a : 数组最后一个元素的索引 @a.
END { ... } :读取所有输入行后,执行块内的代码。此处,按指定顺序打印行。