有没有一种方法可以替换某些字符的所有出现,但只能替换每第n行?

时间:2019-03-24 21:16:05

标签: awk fasta tr

我正在尝试在法斯塔的序列部分中将所有不是CTAG的字符替换为N文件-即每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

3 个答案:

答案 0 :(得分:2)

由于@kvantour对fasta文件的解释,这是另一种sed解决方案,它比旧解决方案更适合您的任务:

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

答案 1 :(得分:2)

您遇到的问题很容易回答,但是当您处理常规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

答案 2 :(得分:1)

这是awk

的一种解决方案
awk 'NR%2 ==0{gsub(/[^CTAG]/, "N")}1' file

结果

SEQUENCE_1
AGCNGTNANTGCTG
SEQUENCE_2
AGGNGTNANTGCTC

说明 正如OP所希望的,我只想查找每条偶数行以应用更改,方法为   NR/2 == 0

NR是到目前为止file

读取的记录数(行)。

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

[^CTAG] ^是否定

awk过去了 expression action格式

这里expressionNR/2==0,并且该操作是将N以外的gsub字符替换为CTAG