Shell脚本:如何将文件分区为列?

时间:2015-08-26 02:32:21

标签: linux shell

我有一个看起来像的文件:

t1   ATGCGTCCGTAGCAG
t2   ATGCCTAGCTAGGCT

即。其后的名称是(DNA)序列。我想分区序列。例如,上面的序列长度为15,我希望将它分成长度为5的3个部分。我想要有三个新文件:

的file1

t1   ATGCG
t2   ATGCC

file2的

t1   TCCGT
t2   TAGCT

file3的

t1   AGCAG
t2   AGGCT

我正在尝试编写一个shell脚本来完成此任务。一种方法是使用sed '$Nq;d'编写for循环以获取文件的第N行,然后通过cut -c命令将其删除并将其保存到变量中。然后,使用cut, head, tail命令和另外一个变量,我将实现它。但是,我想知道是否有更好的方法(整洁和速度)来做到这一点。

PS:实际文件将包含1-10万行,每个序列的长度为10-50k,我将序列分成长度为1-2k的序列。

3 个答案:

答案 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
相关问题