【问题标题】:prepend text to every n:th line in a textfile将文本添加到文本文件中的每 n 行
【发布时间】:2016-11-28 23:03:37
【问题描述】:

这个 sed 命令行脚本在文件的每一行添加文本:

sed -i 's/^/to be prepended/g' text.txt

我怎样才能让它只在每 nth 行上这样做?

我正在处理测序数据,在“norma”多 fasta 格式中,首先有一个以 > 开头的标识符行,然后是其他文本。

下一行以“AATTGCC”等随机 DNA 序列开头,当该字符串完成其新行和新标识符后,我如何在序列行的开头添加文本(附加碱基)?

【问题讨论】:

  • Fasta 格式并不总是交替的标题/序列行,你不应该依赖它!只需使用只有标题行以'>'开头的事实

标签: sed bioinformatics


【解决方案1】:

只需使用以下 GNU sed 语法:

sed '0~Ns/^/to be prepended/'
#    ^^^
#    set N to the number you want!

例如,将 HA 附加到是 4 的倍数的行号:

$ seq 10 | sed '0~4s/^/HA/'
1
2
3
HA4
5
6
7
HA8
9
10

或者那些在4N+1 表格上的人:

$ seq 10 | sed '1~4s/^/HA/'
HA1
2
3
4
HA5
6
7
8
HA9
10

来自sed manual → 3.2. Selecting lines with sed

第一步

这个 GNU 扩展匹配从 line first 开始的每个 stepth 行。特别是,当存在非负 n 时,将选择行,使得当前行号等于 first + (n * step)。因此,要选择奇数行,可以使用 1~2;从第二行开始每隔三行选择一次,将使用“2~3”;从第 10 行开始每隔 5 行选取一次,使用‘10~5’;而“50~0”只是表示 50 的一种模糊方式。

顺便说一句,全局替换不需要使用/g,因为^每行只能替换一次。

【讨论】:

    【解决方案2】:
    $ seq 10 | perl -pe's/^/to be prepended / unless $. % 3'
    1
    2
    to be prepended 3
    4
    5
    to be prepended 6
    7
    8
    to be prepended 9
    10
    $ seq 10 | perl -pe's/^/to be prepended / unless $. % 3 - 1'
    to be prepended 1
    2
    3
    to be prepended 4
    5
    6
    to be prepended 7
    8
    9
    to be prepended 10
    $ seq 10 | perl -pe's/^/to be prepended / unless $. % 3 - 2'
    1
    to be prepended 2
    3
    4
    to be prepended 5
    6
    7
    to be prepended 8
    9
    10
    

    你有个主意。

    【讨论】:

      【解决方案3】:
      seq 15|awk -v line=4  'NR%line==0{$0="Prepend this text : " $0}1'
      1
      2
      3
      Prepend this text : 4
      5
      6
      7
      Prepend this text : 8
      9
      10
      11
      Prepend this text : 12
      13
      14
      15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 2014-11-15
        • 2018-05-05
        • 1970-01-01
        相关资源
        最近更新 更多