我有一个大文件,其格式tab
如下:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT recombination
chr1 586001 >63041388>63041391 G A 60 . AC=80;AF=0.3125;AN=256;AT=>63041388>63041390>63041391,>63041388>63041389>63041391;NS=3;LV=0 GT 1|2|3|
现在,最后一列(第 10 列)出现的数字等于用竖线除以 0 |
;但是,我希望实现以下目标:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT recombination
chr1 586001 >63041388>63041391 G A 60 . AC=80;AF=0.3125;AN=256;AT=>63041388>63041390>63041391,>63041388>63041389>63041391;NS=3;LV=0 GT 1|1 2|2 3|3
tab
我设法通过替换符号来分隔列|
,这让我知道如何复制它们并添加|
数字之间的数字。我尝试了几次for
循环,但我能做的最好的就是只打印两列,如下所示:
1 1
2 2
3 3
...
否则printf
我会得到一行输出但不能保持计数器与初始列相同的值...非常感谢任何帮助,提前谢谢!
这应该可以做到:
解释
awk -F '\t' -v OFS='\t'
:将输入(-F '\t'
)和输出(-v OFS='\t'
)字段分隔符设置为制表符。/^[^#]/{ ... }
: 在不以 开头的行上#
,即非标题行。gsub("\\|","\t",$10);
:将|
第 10 个字段中的所有内容替换为制表符。gsub("[0-9]+","&|&\t",$10)
|
:现在用它们自己、a以及它们自己和一个制表符 替换所有的数字集。/^[^#]/{ ... }1'
:当某些东西的计算结果为真时,其默认操作awk
是打印当前记录(行),因此这个1
总是计算结果为真(非 0)并且超出/^[^#]/{}
条件的,将打印每一行。它在您的数据上的表现如下(为清楚起见,仅显示前几个字段):
请注意,这不是有效的 VCF,您还需要在
#CHROM
列出的每个基因型的标题上有一个样本名称,以便设计用于使用 VCF 的工具可以正确处理它。使用
awk
:-F
字段分隔符和OFS
O
输出F
字段S
分隔符设置为\t
ab。$10
是通过 p pe 作为 sepsplit
来排列的。a
|
$10
设置为空字符串""
。$10
使用循环重新创建for
。1
始终为真,即打印当前记录。事实上,除了空字符串或零之外,其他任何内容都是真。tab
如果您不介意在记录末尾添加额外内容,那么命令可以缩短为$10 = $10 a[i]"|"a[i] OFS
。