【问题标题】:copying every nth line to a new line将每第 n 行复制到新行
【发布时间】:2014-04-07 02:48:20
【问题描述】:

我有一个 txt 文件,我需要复制每四行的第一行并将其打印到每四行的第三行。并将其打印到一个新的 txt 文件中。 例如

@CR5SM:00004:00029
TTTTCTCTTTCTTTCTT
+
>>>/>@99419BAAABB
@CR5SM:00005:00026
ATTATAGAGGGATAG
+
;969999999-4;BB

改成这样:

@CR5SM:00004:00029
TTTTCTCTTTCTTTCTT
+CR5SM:00004:00029
>>>/>@99419BAAABB
@CR5SM:00005:00026
ATTATAGAGGGATAG
+CR5SM:00005:00026
;969999999-4;BB

我尝试过使用 Awk,但似乎找不到正确的命令来执行此操作。 有没有人有任何解决方案?谢谢

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    使用awk

    $ awk '/^@/{a=substr($0,2)}/^\+/{$0=$0 a}1' file
    @CR5SM:00004:00029
    TTTTCTCTTTCTTTCTT
    +CR5SM:00004:00029
    >>>/>@99419BAAABB
    @CR5SM:00005:00026
    ATTATAGAGGGATAG
    +CR5SM:00005:00026
    ;969999999-4;BB
    

    您可以通过以下方式将输出重定向到另一个文件:

    awk '/^@/{a=substr($0,2)}/^\+/{$0=$0 a}1' file > newfile
    
    • 我们使用substr 函数来捕获以@ 开头的从第二个字符开始到行尾的行。
    • 我们寻找以+ 开头的行(注意我们将其转义,因为它是一个元字符)。一旦我们找到该行,我们将捕获的行附加到现有行。
    • 最后的1 允许我们打印这些行。

    【讨论】:

    • 优雅,但它依赖于行的 content 而不是它们的 index
    • @mklement0 正确,但这似乎是某种生物医学 fasta 输出,对内容的依赖可能会得到回报,尤其是当某些蛋白质序列重叠到多行时。不过只是猜测。 :)
    • 听起来不错 - 只是想指出这一点;可能值得在您的回答中说明这一点。
    • @mklement0 也许不需要。这些是具有相当特定输出的 fasta 文件。
    【解决方案2】:

    试试:

    awk '
     (NR-1) % 4 == 0 { l=substr($0,2); print; next } # save every 4th line (print & continue)
     (NR-1) % 4 == 2 { print $0 l; next }            # append saved line to every 3rd line (print & continue)
     { print }' \                                    # all other lines: print as is
     infile > outfile  # specify input file and redirect output to output file
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed 'h;n;n;G;s/\n.//;n'  file
      

      复制第一行,打印第一行和第二行,并将第一行附加到第三行,删除第一行的第一个字符,打印第四行并重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多