我有一个看起来像的文件:
t1 ATGCGTCCGTAGCAG
t2 ATGCCTAGCTAGGCT
即。其后的名称是(DNA)序列。我想分区序列。例如,上面的序列长度为15,我希望将它分成长度为5的3个部分。我想要有三个新文件:
t1 ATGCG
t2 ATGCC
t1 TCCGT
t2 TAGCT
t1 AGCAG
t2 AGGCT
我正在尝试编写一个shell脚本来完成此任务。一种方法是使用sed '$Nq;d'
编写for循环以获取文件的第N行,然后通过cut -c
命令将其删除并将其保存到变量中。然后,使用cut, head, tail
命令和另外一个变量,我将实现它。但是,我想知道是否有更好的方法(整洁和速度)来做到这一点。
PS:实际文件将包含1-10万行,每个序列的长度为10-50k,我将序列分成长度为1-2k的序列。
答案 0 :(得分:2)
以下使用子字符串表示法(即string:start:length)来提取请求的输出:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo ${line:0:10} >> file1
echo ${line:0:5} ${line:10:5} >> file2
echo ${line:0:5} ${line:15:5} >> file3
done < "$1"
将其保存到myscript.sh并使用:./myscript.sh <input-file>
答案 1 :(得分:1)
单线解决方案,使用单个循环:
for i in $(seq 3); do cut -c1-5,$((i * 5 + 1))-$(((i + 1) * 5)) < source.txt > file$i.txt ; done
根据您自己的宽度调整计算。你真的不需要逐行进行,这将非常慢。
答案 2 :(得分:1)
awk可以提供帮助
:class => "form-control"
扩展awk
awk '{for(i=1;i<=3;i++)print $1" "substr($2,5*(i-1)+1,5) >> "file"i".txt"}' inputfilename