Awk 是否有一种方法可以替换某些字符的所有出现,但只能替换每N行?

Awk 是否有一种方法可以替换某些字符的所有出现,但只能替换每N行?,awk,fasta,tr,Awk,Fasta,Tr,我试图用fasta文件序列部分中的N替换所有不是C、T、A或G的字符,即每2行 我认为awk和tr的结合是我需要的 要每隔一行打印一次,请执行以下操作: awk '{if (NR % 2 == 0) print $0}' myfile 将这些字符替换为N tr YRHIQ- N …但我不知道如何组合它们,以便字符替换仅在每第二行上进行,但它会打印每一行 这就是我所拥有的那种东西 >SEQUENCE_1 AGCYGTQA-TGCTG >SEQUENCE_2 AGGYGTQA-TGC

我试图用fasta文件序列部分中的
N
替换所有不是
C
T
A
G
的字符,即每2行

我认为awk和tr的结合是我需要的

要每隔一行打印一次,请执行以下操作:

awk '{if (NR % 2 == 0) print $0}' myfile
将这些字符替换为
N

tr YRHIQ- N
…但我不知道如何组合它们,以便字符替换仅在每第二行上进行,但它会打印每一行

这就是我所拥有的那种东西

>SEQUENCE_1
AGCYGTQA-TGCTG
>SEQUENCE_2
AGGYGTQA-TGCTC
我希望它看起来像这样:

>SEQUENCE_1
AGCNGTNANTGCTG
>SEQUENCE_2
AGGNGTNANTGCTC
>SENUENCE_1
AGCNGTNANTGCTG
>SENUENCE_2
AGGNGTNANTGCTC
但不是这样:

>SEQUENCE_1
AGCNGTNANTGCTG
>SEQUENCE_2
AGGNGTNANTGCTC
>SENUENCE_1
AGCNGTNANTGCTG
>SENUENCE_2
AGGNGTNANTGCTC

感谢@kvantour对fasta文件的解释,这里有另一个sed解决方案比旧的更适合您的任务:

sed '/^>/! s/[^ACTG]/N/g' file.fasta
  • /^>/如果此行不是以
    开头,请执行以下操作
  • s/[^ACTG]/N/g
    ACTG
    以外的所有字符替换为
    N

    • 这里有一个使用
      awk的解决方案

      awk 'NR%2 ==0{gsub(/[^CTAG]/, "N")}1' file
      
      结果

      SEQUENCE_1
      AGCNGTNANTGCTG
      SEQUENCE_2
      AGGNGTNANTGCTC
      
      解释 正如OP所希望的那样,我只寻找每一个偶数行来应用更改
      NR/2==0

      NR
      是迄今为止从
      文件读取的记录数(此处为行)

      gsub(/[^CTAG]/,“N”)
      替换为所有不是“C”、“T”、“A”、“G”的字符

      [^CTAG]
      这个
      ^
      就是否定

      而且
      awk
      过去了
      表达式
      操作
      格式


      这里的
      表达式是
      NR/2==0
      ,操作是将
      N
      字符替换为
      gsub
      ,这些字符不是
      CTAG

      您的问题很容易回答,但在处理通用fasta文件时对您没有帮助。Fasta文件有一个序列头,后跟一行或多行,可以连接起来表示序列。Fasta文件格式大致遵循以下规则:

      • 以字符(
        )开头的描述行(defline)或标题/标识符行为序列提供名称和/或唯一标识符,还可能包含其他信息
      • 描述行后面是标准单字母字符串中的实际序列本身。除有效字符以外的任何内容都将被忽略(包括空格、制表符、星号等)
      • 序列可以跨越多行
      • 多序列FASTA格式是通过将多个单序列FASTA文件连接到一个公共文件中获得的,通常是通过在两个后续序列之间留下空行来实现的
      要回答OP的问题,如果您只想处理每一行,您需要执行以下操作:

      awk '!(NR%2){gsub(/[^CTAG]/, "N")}1' file.fasta
      
      但是,在以下任何情况下,此方法都将失败:

      • fasta是一个具有多行序列的文件
      • multi-fasta文件在后续序列之间可能有一个空行
      更好的方法是排除标题行并处理所有其他行:

      awk '!/^>/{gsub(/[^CTAG]/, "N")}1' file.fasta
      

      我收到以下错误-您知道原因吗?:sed:1:“0~2 s/[^ACGT]/N/g”:无效的命令代码~知道如何检查吗?似乎在OSX上并不简单??:关于fasta文件的好信息。谢谢分享。我不知道什么是
      fasta
      文件。如果你不介意发布一个样本,以及它是如何生成的?Fasta文件是DNA序列数据的常用输入/输出格式。当你做DNA测序时,这是你经常收到数据的格式。它们看起来像原始问题中给出的示例,尽管像@kvantour所说,它们可能是多行的,即1个序列可以由1个标题行和多个序列行表示。现在越来越常见的是fastq文件,它们是相同的,但每个序列限制为4行:第1行-标题行(以“@”开头);第2行-序列线;第3行-“+”;第4行-每个DNA字母的质量信息