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个是输入错误。我已经更正了,对不起!