有没有办法替换所有出现的某些字符,但仅限于每第n行?

问题描述 投票:2回答:3

我试图用fasta文件的序列部分中的C替换所有不是TAGN的字符 - 即每隔一行

我认为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
awk fasta tr
3个回答
2
投票

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

  • 描述行(defline)或标题/标识符行以<greater-then>字符(>)开头,为序列提供名称和/或唯一标识符,还可能包含其他信息。
  • 在描述行之后是标准单字母字符串中的实际序列。除了有效字符之外的任何内容都将被忽略(包括空格,制表符,星号等)。
  • 序列可以跨越多行。
  • 通过在公共文件中连接几个单序列FASTA文件,通常通过在两个后续序列之间留下空行来获得多序列FASTA格式。

要回答OP的问题,如果您只想处理每一行,您希望:

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

但是,在以下任何情况下,此方法都将失败:

  • 具有多行序列的fasta文件
  • multi-fasta文件,后续序列之间可能有空行

更好的方法是排除标题行并处理所有其他行:

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

2
投票

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

sed '/^>/! s/[^ACTG]/N/g' file.fasta
  • /^>/!:如果此行不以>开头,请执行以下操作:
  • s/[^ACTG]/N/g:用ACTG取代每个角色,但N

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

© www.soinside.com 2019 - 2024. All rights reserved.