【问题标题】:wondering if sed or awk can reorder using line number [closed]想知道 sed 或 awk 是否可以使用行号重新排序 [关闭]
【发布时间】:2021-03-24 10:51:00
【问题描述】:

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

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
.
.

谢谢!

【问题讨论】:

  • 您的问题不清楚,请添加您想要获得输出的逻辑。还要在您的问题中添加您在 SO 上受到高度鼓励的努力以及 CODE TAGS 中的输出示例。

标签: perl awk sed


【解决方案1】:

在 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

【讨论】:

  • 嗯,它会产生错误的输出。哦,是的,您的订单有 13 两次。
  • 谢谢!对不起,额外的 13 是一个错字。我已经更正了,对不起!
【解决方案2】:

使用这个 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 { ... } :读取所有输入行后,执行块内的代码。在这里,按照指定的顺序打印行。

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 2013-09-07
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多