【问题标题】:Swap lines in a script by iteration over lines [closed]通过迭代行来交换脚本中的行[关闭]
【发布时间】:2015-07-01 14:16:08
【问题描述】:

这是我的文件:

>ref
AAAAAAA
>seq1
BBBBBBB
>ref
AAAAAAA
>seq2
CCCCCCC
>ref
AAAAAAA
>seq3
DDDDDDD
...

这是我想要的:

>seq1
AAAAAAA
>ref
BBBBBBB
>seq2
AAAAAAA
>ref
CCCCCCC
>seq3
AAAAAAA
>ref
DDDDDDD
...

因此,将第 1 行与第 3 行交换,将第 5 行与第 7 行交换,将第 9 行与第 11 行交换,等等。 任何关于我如何做到这一点的建议(在 bash、perl 或 python 中)将不胜感激! :)

【问题讨论】:

  • 1) 选择一种语言 2) 展示你目前的尝试
  • 您必须为我们提供一个最小的工作示例。这也有助于我们了解您为解决问题所做的努力。 :)
  • 使用awk 是小菜一碟。在伪代码中,您可以使用 awk 'if line contains ">ref" {store line header; next line; store line content; next line; next line; print ">ref"; print current line; print stored line header; print stored line content}'
  • 哇哇哇,对不起,我没有说到目前为止我已经尝试过什么!我用 Vim 打开了我的文件,然后做了:1m3|1m2|5m7|5m6|9m11|9m10,但是对于一个长文件来说,这样做有点像噩梦!所以这就是为什么我想到了另一个脚本。 @ShellFish,我明白了,但是我对 awk 还不够熟悉,无法吃这个“小菜一碟”;)
  • 在 vim 中录制一个宏,并根据需要执行多次。谷歌宏 vim,它是一个救生员

标签: python bash perl swap fasta


【解决方案1】:

从命令行使用 perl,

perl -ne 'push @r, $_; print(@r[2,1,0,3]), @r=() if @r==4 or eof' file

【讨论】:

    【解决方案2】:

    这是python 2.7

    在这里,您逐行浏览输入文件。如果该行是ref,它将用带有运行编号的seq 替换它。其他线路保持不变。

    fo = open("input.txt", "r")
    calc = 1
    ref = "ref"
    seq = "seq"
    
    for lines in fo:
        lines = lines.strip()
        if "ref" in lines:
            lines = seq + str(calc)
            calc = int(calc) +1 
            print lines
        elif "seq" in lines:
            print ref
        else:
             print lines
    

    输出:

    seq1
    AAAAAAA
    ref
    BBBBBBB
    seq2
    AAAAAAA
    ref
    CCCCCCC
    seq3
    AAAAAAA
    ref
    DDDDDDD
    

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2014-08-13
      • 2018-10-06
      • 2023-01-13
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多