【问题标题】:Move lines in file using awk/sed使用 awk/sed 移动文件中的行
【发布时间】:2023-01-24 21:23:36
【问题描述】:

嗨,我的文件看起来像:

>ID.1
GGAACACGACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAAAAGTACTGGA
>ID.2
GGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGA

我想移动这些行,以便第 1 行与第 3 行交换,第 2 行与第 4 行交换。

>ID.2
GGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGA
>ID.1
GGAACACGACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAAAAGTACTGGA

我考虑过使用cut,所以将这些行剪切发送到其他文件中,然后使用paste 将它们全部按所需顺序返回,但是有没有使用 awk/sed 的解决方案。

编辑:该文件始终有 4 行(2 个 fasta 条目),仅此而已。

【问题讨论】:

  • 如果一个文件包含 5 或 6 行怎么办?
  • 我看不出 cut 在这里有什么帮助,所以如果你能想到一个 cut/paste 解决方案,我很想知道。如果我必须实现它,我会首先创建文件中所有行的数组,然后根据元素的不同顺序编写新文件。
  • 我也无法想象您认为 cutpaste 会如何帮助您解决这个问题,但您可以使用 awksed 以及 man headtail 来完成。

标签: bash awk sed


【解决方案1】:

对于这种简单的情况,正如@Ed_Morton 提到的,您可以使用 headtail 命令交换偶数大小的切片:

$ tail -2 test.txt; head -2 test.txt

>ID.2
GGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGA
>ID.1
GGAACACGACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAAAAGTACTGGA

【讨论】:

    【解决方案2】:

    这似乎有效:

    awk -F'
    ' '{print $3, $4, $1, $2}' OFS='
    ' RS= ORS='
    
    ' file.txt
    

    【讨论】:

    • 这将在输出的末尾添加一个额外的空行。
    【解决方案3】:

    使用 sed:

    sed -n '1,2H;3p;4{p;x;D;p}'
    
    • 将第 1,2 行存储到保留空间;
    • 打印第三行;
    • 打印第四行,将保持空间与模式空间交换,删除换行符,打印存储的行。

    【讨论】:

    • 也许sed '1h;2H;1,2d;4G' file
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-04-21
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多