我试图用fasta文件的序列部分中的C
替换所有不是T
,A
,G
或N
的字符 - 即每隔一行
我认为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
您遇到的问题很容易回答,但在处理通用fasta文件时无法帮助您。 Fasta文件有一个序列标题,后跟一行或多行,可以连接起来表示序列。 Fasta文件格式大致遵循以下规则:
- 描述行(defline)或标题/标识符行以<greater-then>字符(
>
)开头,为序列提供名称和/或唯一标识符,还可能包含其他信息。- 在描述行之后是标准单字母字符串中的实际序列。除了有效字符之外的任何内容都将被忽略(包括空格,制表符,星号等)。
- 序列可以跨越多行。
- 通过在公共文件中连接几个单序列FASTA文件,通常通过在两个后续序列之间留下空行来获得多序列FASTA格式。
要回答OP的问题,如果您只想处理每一行,您希望:
awk '!(NR%2){gsub(/[^CTAG]/, "N")}1' file.fasta
但是,在以下任何情况下,此方法都将失败:
更好的方法是排除标题行并处理所有其他行:
awk '!/^>/{gsub(/[^CTAG]/, "N")}1' file.fasta
感谢@ 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
是迄今为止从file
读取的记录数(行数)
和gsub(/[^CTAG]/, "N")
替换所有不是'C','T','A','G'的字符
[^CTAG]
^
是否定
和awk
通过expression
action
格式
在这里expression
是NR/2==0
和行动用N
替换字符与gsub
不是CTAG