从文件中每隔一行删除前 15 个字符
remove the first 15 characters from every other line in a file
我有一些看起来像这样的 txt 文件(它们包含 DNA 序列和示例代码):
>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
我想删除文件中每隔一行的前 15 个字符。这将从第二、第四、第六、第八行(等)中删除字符串 GACTACACGTAGTAT
。
例如 cut 命令可以删除每行的前 15 个字符:
cut -c 1-15 /path/to/file.txt
我想只应用于每隔一行,从第二行开始。
以下脚本可能对您有所帮助,它有两个参数:
1. 原始文件(从中进行转换)
2. 保存结果的文件。
#!/bin/bash
# call this script and pass two arguments:
# ./script FROM_FILE TO_FILE
FROM=
TO=
i=1;
while IFS=$'\n' read line; do
((i++));
# skip 2,4,6, ..., nth lines
[ $((i % 2)) -eq 0 ] && (echo -n $line >> $TO; continue);
echo ${line:15} >> $TO
done < $FROM
如果您不介意使用 sed
并假设其他行以 >
开头,那么以下内容将删除其他行的前 15 个连续大写字符 "A-Z":
sed 's/^[A-Z]\{15\}//' file > new_file
或者,就地编辑 (GNU sed) 使用 -i
:
sed -i 's/^[A-Z]\{15\}//' file
或者,就地编辑 (BSD sed) 使用 -i ''
:
sed -i '' 's/^[A-Z]\{15\}//' file
或者,备份:
sed -i.bak 's/^[A-Z]\{15\}//' file
示例:
$ cat file
>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$ sed 's/^[A-Z]\{15\}//' file
>SRR1502445.1
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$
你需要删除文件 fasta 的第一碱基并进行分析,而我找到了 QIIME 的解决方案,一个使用 python 和 bio[=27= 的解决方案]:
from Bio import SeqIO
file_fasta = open("test.fasta")
file_qual = open("test.qual")
iterator_fasta = SeqIO.parse(file_fasta, "fasta")
iterator_qual = SeqIO.parse(file_qual, "qual")
size_trim = 15
output_fasta = open("trim.fasta","w")
for seq in iterator_fasta:
if len(seq) <= size_trim:
raise NameError('len seq less or equal than trim size')
seq.seq = seq.seq[size_trim:]
output_fasta.write(seq.format("fasta"))
output_fasta.close()
output_qual = open("trim.qual","w")
for seq_qual in iterator_qual:
if len(seq_qual.letter_annotations['phred_quality']) <= size_trim:
raise NameError('len qual less or equal than trim size')
seq_qual.letter_annotations['phred_quality'] = seq_qual.letter_annotations['phred_quality']
output_qual.write(seq_qual.format("qual"))
output_qual.close()
你进入trim.fasta
>SRR1502445.1
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGG
AAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
编辑:
使用 qiime,我建议使用 split_libraries,它会 trim 并检查质量.... truncate_fasta_qual_files.py
仅 select 第一个 B 碱基,trim 最后一个基地与预期不同。
使用正则表达式和 perl 或 awk,
perl(写一个脚本,扩展它来检测其他正则表达式,
my $pattern=$ARGV[1]||"GACTACACGTAGT";
#provide any gene sequence prefix, and pattern removes that prefix
while (<>) {
#explicit check for non-gene/header pattern
if( $_ =~ /^[\>\;]/ ) {
print $_;
}
#check for the specific header pattern provided, for example
elsif( $_ =~ /^SRR1502445/ ) {
print $_;
}
#check for the gene pattern given
elsif( $_ =~ /^$pattern(.*)/ ) {
print "\n";
}
else {
print $_;
}
}
perl -lane,
perl -lane 'if( $_ =~ /^GACTACACGTAGT(.*)/ ) {print "\n";} else {print $_; }'
awk,
/SRR1502445/ { print [=12=]; }
/^GACTACACGTAGTAT/ { print substr([=12=],16); }
适用于任何 linux/unix 框,也适用于 cygwin。
文件格式好像是FASTA, which is described here FASTA Specification
你可以试试
sed '0~2s/^.\{15\}//g' filename
0~2 takes every 2nd line
^.\{15\}
looks for the first 15 characters
The sed command replaces them with nothing!
sed
的一种替代方法是 awk
。
给定一个名为 foo.fa
的交替排列元素 FASTA 文件,您可以使用 substr()
:
去除序列字符串的前 15 个字符
$ awk '/^#/ {next} /^>/ { print [=10=] } /^[^>]/ { print substr([=10=], 16, length([=10=]) - 15) }' foo.fa > foo.filtered.fa
由于awk
使用从1开始的索引,substr()
中的起始位置参数是16。
除了提供单独处理交替行的代码外,awk
的另一个优点是它有时 运行 比 sed
快。考虑到常见生物信息学平台之间 sed
的差异,另一个优势是便携性。
因此,如果您打算经常这样做或对 "whole genome" 规模的文件执行此操作,您也可以研究这种方法。
我有一些看起来像这样的 txt 文件(它们包含 DNA 序列和示例代码):
>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
我想删除文件中每隔一行的前 15 个字符。这将从第二、第四、第六、第八行(等)中删除字符串 GACTACACGTAGTAT
。
例如 cut 命令可以删除每行的前 15 个字符:
cut -c 1-15 /path/to/file.txt
我想只应用于每隔一行,从第二行开始。
以下脚本可能对您有所帮助,它有两个参数: 1. 原始文件(从中进行转换) 2. 保存结果的文件。
#!/bin/bash
# call this script and pass two arguments:
# ./script FROM_FILE TO_FILE
FROM=
TO=
i=1;
while IFS=$'\n' read line; do
((i++));
# skip 2,4,6, ..., nth lines
[ $((i % 2)) -eq 0 ] && (echo -n $line >> $TO; continue);
echo ${line:15} >> $TO
done < $FROM
如果您不介意使用 sed
并假设其他行以 >
开头,那么以下内容将删除其他行的前 15 个连续大写字符 "A-Z":
sed 's/^[A-Z]\{15\}//' file > new_file
或者,就地编辑 (GNU sed) 使用 -i
:
sed -i 's/^[A-Z]\{15\}//' file
或者,就地编辑 (BSD sed) 使用 -i ''
:
sed -i '' 's/^[A-Z]\{15\}//' file
或者,备份:
sed -i.bak 's/^[A-Z]\{15\}//' file
示例:
$ cat file
>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$ sed 's/^[A-Z]\{15\}//' file
>SRR1502445.1
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$
你需要删除文件 fasta 的第一碱基并进行分析,而我找到了 QIIME 的解决方案,一个使用 python 和 bio[=27= 的解决方案]:
from Bio import SeqIO
file_fasta = open("test.fasta")
file_qual = open("test.qual")
iterator_fasta = SeqIO.parse(file_fasta, "fasta")
iterator_qual = SeqIO.parse(file_qual, "qual")
size_trim = 15
output_fasta = open("trim.fasta","w")
for seq in iterator_fasta:
if len(seq) <= size_trim:
raise NameError('len seq less or equal than trim size')
seq.seq = seq.seq[size_trim:]
output_fasta.write(seq.format("fasta"))
output_fasta.close()
output_qual = open("trim.qual","w")
for seq_qual in iterator_qual:
if len(seq_qual.letter_annotations['phred_quality']) <= size_trim:
raise NameError('len qual less or equal than trim size')
seq_qual.letter_annotations['phred_quality'] = seq_qual.letter_annotations['phred_quality']
output_qual.write(seq_qual.format("qual"))
output_qual.close()
你进入trim.fasta
>SRR1502445.1 ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG GAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN >SRR1502445.2 ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGG AAGCGGGTTCCAAGGCACACAGGGGATAGGNNN >SRR1502445.3 ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN >SRR1502445.4 ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
编辑:
使用 qiime,我建议使用 split_libraries,它会 trim 并检查质量.... truncate_fasta_qual_files.py
仅 select 第一个 B 碱基,trim 最后一个基地与预期不同。
使用正则表达式和 perl 或 awk,
perl(写一个脚本,扩展它来检测其他正则表达式,
my $pattern=$ARGV[1]||"GACTACACGTAGT";
#provide any gene sequence prefix, and pattern removes that prefix
while (<>) {
#explicit check for non-gene/header pattern
if( $_ =~ /^[\>\;]/ ) {
print $_;
}
#check for the specific header pattern provided, for example
elsif( $_ =~ /^SRR1502445/ ) {
print $_;
}
#check for the gene pattern given
elsif( $_ =~ /^$pattern(.*)/ ) {
print "\n";
}
else {
print $_;
}
}
perl -lane,
perl -lane 'if( $_ =~ /^GACTACACGTAGT(.*)/ ) {print "\n";} else {print $_; }'
awk,
/SRR1502445/ { print [=12=]; }
/^GACTACACGTAGTAT/ { print substr([=12=],16); }
适用于任何 linux/unix 框,也适用于 cygwin。
文件格式好像是FASTA, which is described here FASTA Specification
你可以试试
sed '0~2s/^.\{15\}//g' filename
0~2 takes every 2nd line
^.\{15\}
looks for the first 15 characters
The sed command replaces them with nothing!
sed
的一种替代方法是 awk
。
给定一个名为 foo.fa
的交替排列元素 FASTA 文件,您可以使用 substr()
:
$ awk '/^#/ {next} /^>/ { print [=10=] } /^[^>]/ { print substr([=10=], 16, length([=10=]) - 15) }' foo.fa > foo.filtered.fa
由于awk
使用从1开始的索引,substr()
中的起始位置参数是16。
除了提供单独处理交替行的代码外,awk
的另一个优点是它有时 运行 比 sed
快。考虑到常见生物信息学平台之间 sed
的差异,另一个优势是便携性。
因此,如果您打算经常这样做或对 "whole genome" 规模的文件执行此操作,您也可以研究这种方法。