![过滤掉长度](https://linux22.com/image/5096/%E8%BF%87%E6%BB%A4%E6%8E%89%E9%95%BF%E5%BA%A6.png)
我有一个包含 3940 个序列的文件,看起来像
>TCONS_00000066 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAG
CGCTACGGTCCACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTT
CCTCATCGAGCAGCAGCAACTCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACA
CGGCAACAACACTTTATACTTGTGTATAATTTCTCTTCGTTTCTGAGTTCATGGCTATCT
TTGTCTCTCTTATCTTCTCCCTTTTGCTATCTCTATATTTGTGATTGCCATGGAAATACA
>TCONS_00006042 gene=XLOC_003448
GCCACTAGCCAGCCCAGCCAGGGGAAGGGGAGGAGCTGCAAGCCCAACCCCCTGCTCAAC
CCTAAATTGCTTCCGCCGATCGGTGAGAGCTCCGATGCCTTCTTCTTCTTCTTCTTCCTC
CCCCTCTACCTGTTCCTTCTCCGAGATAACTGCAACATTTTCAGCACTTTTTCTGGCCAT
TCTCAAGTCCCCAGCCCAGGGACTAGAGTGTTACTATGGCTAGAGCAAATGAGATGGTCA
GGGCAGACTCAAGGATGATGGTTGTCTTTAGTGCCCTGGCATCTAAATCAGGGCCACTGA
CATTTGAAGACTCGCTCAGATTTGTCAAGAAAGTGAAGGCTTGTAACTACATGTTGTATT
我想要另一个文件中长度超过 200 个字符的序列
答案1
您可以使用 sed 或 awk 或 grep。
awk 'length($0)>200' file > newfile
或者
grep '^.\{201\}' file > newfile
答案2
您awk
需要首先设置>
为记录分隔符:
awk 'BEGIN{RS=">";ORS=""}length($0)>200{print ">"$0}' input > output
另一种选择pcregrep
:
pcregrep -M '^>[^>]{201,}' input > output
或者只计算 DNA 序列,而不计算标题中的字符:
pcregrep -M '^>[^>]*\n[^>]{201,}' input > output
答案3
Python (split.py
):
import sys
# call with the file as parameter
base = 0
line = ''
with open(sys.argv[-1]) as fp:
with open('shorter', 'w') as fps:
with open('longer', 'w') as fpl:
for x in fp:
if line and x.startswith('>'):
print len(line), base
if (len(line) - base) >= 200:
fpl.write(line)
else:
fps.write(line)
line = x
base = len(x) # lenght of the ">..." line
continue
if x.startswith('>'): # very first one
base = len(x)
line += x
if line:
if len(line) >= 200:
fpl.write(line)
else:
fps.write(line)
line = ""
调用 withpython split.py inputfile
然后mv shorter inputfile
(检查文件正常后)
答案4
cat file | while read -r line; do
if [ ${#line} -gt 200 ]; then
echo "${line}"
fi
done
编辑问题已更新:不需要一行的长度,而是需要一组行的长度。
在下面的脚本中,我回显 >TCONS,否则脚本将跳过最后一次点击。
multiline=""
(cat input; echo ">TCONS string for last token") | while read line; do
if [[ "$(echo "${line}"| cut -c1-6)" = ">TCONS" ]]; then
if [ ${#multiline} -gt 200 ]; then
echo "${multiline}"
fi
multiline=""
else
multiline="${multiline}${line}"
fi
done