所以我有一个像这样的文件,每一行代表一个位置,但有些位置被省略了。(实际上每个脚手架的行数要多得多):
SCF_1 0 1
SCF_1 3 4
SCF_1 9 10
SCF_2 0 1
SCF_2 4 5
SCF_2 12 13
SCF_2 23 24
SCF_2 79 80
SCF_3 2 3
SCF_4 1 2
...
最终,我想为每个脚手架分别制作100kb大小的窗口(每个脚手架上的最后一个窗口将小于100kb).This是它应该看起来的样子:
SCF_1 0 280000
SCF_1 280000 576300
SCF_1 576300 578000
SCF_2 9002 630000
...
范围不应该统一,因为有些位置被省略了。我想以某种方式为每个脚手架创建一个递增编号的列,但我是一个编程新手,不知道怎么做。
SCF_1 0 1 0
SCF_1 3 4 1
SCF_1 9 10 2
SCF_2 0 1 0
SCF_2 4 5 1
SCF_2 12 13 2
SCF_2 23 24 3
SCF_2 79 80 4
SCF_3 2 3 0
SCF_3 5 6 1
发布于 2018-08-03 19:25:07
使用awk似乎很容易做到这一点(假设您的文件名为scf.txt
):
awk 'BEGIN {OFS = "\t"} {counts[$1]++; print $0,counts[$1]-1}' scf.txt
首先,我们将输出字段分隔符(OFS
)设置为表格("\t"
)。然后,对于每一行,我们查看第一个字段($1
),并递增counts
表中的相关值,然后print
当前行($0
),然后是与当前第一列($counts[$1]
)的值减1相对应的计数器的值。
上面的命令输出以下内容:
SCF_1 0 1 0
SCF_1 3 4 1
SCF_1 9 10 2
SCF_2 0 1 0
SCF_2 4 5 1
SCF_2 12 13 2
SCF_2 23 24 3
SCF_2 79 80 4
SCF_3 2 3 0
SCF_4 1 2 0
您可以重定向到一个新文件来保存结果,而不是将其显示在终端上:
awk 'BEGIN {OFS = "\t"} {counts[$1]++; print $0,counts[$1]-1}' scf.txt > scf_counted.txt
(如果脚手架未分组,此解决方案可能也会起作用,但您似乎不需要此额外功能。)
https://stackoverflow.com/questions/51638668
复制相似问题