我有一个包含数百万行和约400个制表符分隔列的大文件(vcf)。下面粘贴了一些列数较少的行:
1/1:0,0,0:0:0,0,0,0 1/1:0,0,0:0:0,0,0,0 1/1:37,3,0:1:0,0,1,0 1/1:0,0,0:0:0,0,0,0
我想用分隔符:
拆分每一列并打印第四组值(col 0的0,0,0,0; col 2的0,0,0,0; 0,每列的0,1,0表示第3列;依此类推)。
所以,期望的输出是:
Col1 Col2 Col3 Col4 .. Coln
0,0,0,0 0,0,0,0 0,0,1,0 0,0,0,0 .. a,b,c,d
对于awk来说,这太疯狂吗?我更喜欢在awk中这样做,因为我的文件在我们的unix服务器中。我可以在R中做到这一点,虽然我可以想象它花了很多时间来阅读文件,拆分每一栏,处理等等。所以我很感激任何帮助。感谢。
可选:为了使这个更难,可以将四个值中的前两个数相加,并将四个值中的最后两个相加以获得value1,value2列?也许我问的太多了。抱歉。在这种情况下,以下是所需的输出:
Col1 Col2 Col3 Col4 .. Coln
0,0 0,0 0,1 0,0 .. a+b,c+d
答案 0 :(得分:0)
awk
救援!
$ awk '{for(i=1;i<=NF;i++)
{sub(/.*:/,"",$i);
split($i,a,",");
$i=a[1]+a[2] "," a[3]+a[4]}}1' file
0,0 0,0 0,1 0,0
添加列标题也不是那么难......
为标签分隔的输出字段设置-v OFS='\t'
。
答案 1 :(得分:0)
awk 'NR==1{
for(i=1;i<=NF*2;i+=2){ #print first line because one column is become two column so NF*2
printf "val"i"\tval"i+1"\t"
}
print "";
}
{
for(i=1;i<=NF;i++) {
match($i,".*(.,.),(.,.)$",a); #match function matches first two numbers of the four values
printf a[1]"\t"a[2]"\t"; #and the last two of the four values
}
print "";
}' file