Awk再添加一列是第三列等于字符串
我有一个VCF文件(以制表符分隔),其中第2列中缺少一些“RPB”值,它将整行移到了左侧 我有以下资料:Awk再添加一列是第三列等于字符串,awk,sed,vcf-vcard,Awk,Sed,Vcf Vcard,我有一个VCF文件(以制表符分隔),其中第2列中缺少一些“RPB”值,它将整行移到了左侧 我有以下资料: 1 AF1=23 AC1=23 2 RPB=123 AF1=23 AC1=23 3 AF1=23 AC1=23 1 NULL AF1=23 AC1=23 2 RPB=123 AF1=23 AC1=23 3 NULL AF1=23 AC1=23 我需要以下资料: 1 AF1=23 AC1=23 2 RPB=123 AF1=23 A
1 AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 AF1=23 AC1=23
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
我需要以下资料:
1 AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 AF1=23 AC1=23
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
我试过了,效果很糟糕
awk 'if($2="AF1%" {print $1,"\t"NULL"\t", print$2, print$3}' input.vcf > output.vcf
我必须将这个VCF导入MySQL,因此必须保留选项卡定界。。有什么想法吗 这款awk one liner将帮助您:
kent$ awk -F'\t' -v OFS='\t' '!($2~/^RPB=/){$2="NULL\t"$2}7' file
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
这款awk one liner将帮助您:
kent$ awk -F'\t' -v OFS='\t' '!($2~/^RPB=/){$2="NULL\t"$2}7' file
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
这款awk one liner将帮助您:
kent$ awk -F'\t' -v OFS='\t' '!($2~/^RPB=/){$2="NULL\t"$2}7' file
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
这款awk one liner将帮助您:
kent$ awk -F'\t' -v OFS='\t' '!($2~/^RPB=/){$2="NULL\t"$2}7' file
1 NULL AF1=23 AC1=23
2 RPB=123 AF1=23 AC1=23
3 NULL AF1=23 AC1=23
如果不应该使用正则表达式,请尝试以下方法:
#!/bin/bash
cat input.vcf |\
perl -ane '
BEGIN{$c=0;$max_fields=0}
$c2=0;
foreach(@F){
$a[$c][$c2]=$_;
if( $c2 > $max_fields ) {
$max_fields=$c2;
}
$c2++
}
$c++;
END{
foreach $i (@a){
while (@$i < $max_fields + 1 ){
unshift (@$i,"NULL");
}
}
foreach $i (@a){
foreach $x (@$i){
print $x,"\t";
}
print "\n";
}
}'
说明:
如果不应该使用正则表达式,请尝试以下方法:
#!/bin/bash
cat input.vcf |\
perl -ane '
BEGIN{$c=0;$max_fields=0}
$c2=0;
foreach(@F){
$a[$c][$c2]=$_;
if( $c2 > $max_fields ) {
$max_fields=$c2;
}
$c2++
}
$c++;
END{
foreach $i (@a){
while (@$i < $max_fields + 1 ){
unshift (@$i,"NULL");
}
}
foreach $i (@a){
foreach $x (@$i){
print $x,"\t";
}
print "\n";
}
}'
说明:
如果不应该使用正则表达式,请尝试以下方法:
#!/bin/bash
cat input.vcf |\
perl -ane '
BEGIN{$c=0;$max_fields=0}
$c2=0;
foreach(@F){
$a[$c][$c2]=$_;
if( $c2 > $max_fields ) {
$max_fields=$c2;
}
$c2++
}
$c++;
END{
foreach $i (@a){
while (@$i < $max_fields + 1 ){
unshift (@$i,"NULL");
}
}
foreach $i (@a){
foreach $x (@$i){
print $x,"\t";
}
print "\n";
}
}'
说明:
如果不应该使用正则表达式,请尝试以下方法:
#!/bin/bash
cat input.vcf |\
perl -ane '
BEGIN{$c=0;$max_fields=0}
$c2=0;
foreach(@F){
$a[$c][$c2]=$_;
if( $c2 > $max_fields ) {
$max_fields=$c2;
}
$c2++
}
$c++;
END{
foreach $i (@a){
while (@$i < $max_fields + 1 ){
unshift (@$i,"NULL");
}
}
foreach $i (@a){
foreach $x (@$i){
print $x,"\t";
}
print "\n";
}
}'
说明:
awk '{if($2~/^AF1/) print $1 "\tNULL\t" $2 "\t" $3; else print}' input.vcf
但正如你所看到的,这不是一个非常惯用的方法
这个改动最小的版本会产生您想要的输出:
awk '{if($2~/^AF1/) print $1 "\tNULL\t" $2 "\t" $3; else print}' input.vcf
但正如你所看到的,这不是一个非常惯用的方法
这个改动最小的版本会产生您想要的输出:
awk '{if($2~/^AF1/) print $1 "\tNULL\t" $2 "\t" $3; else print}' input.vcf
但正如你所看到的,这不是一个非常惯用的方法
这个改动最小的版本会产生您想要的输出:
awk '{if($2~/^AF1/) print $1 "\tNULL\t" $2 "\t" $3; else print}' input.vcf
但正如您所见,这不是一种非常惯用的方法。基于制表符分隔的输入文件:
awk -v OFS="\t" 'NF==3{$1=$1 OFS "NULL"} 1' input.vcf
如果输入文件不是以制表符分隔的,则可以将其更改为以下内容:
awk -v OFS="\t" '{$1=$1 (NF==3 ? OFS "NULL" : "")} 1' input.vcf
在这两种情况下,当NF==3
时,将重新分配第一个字段以包含缺少的数据。在第一个示例中,只有更改行的输出分隔符需要调整,但是当数据没有制表符分隔时,在打印整行的1
之前,需要通过重新分配来“重新计算”每一行
当输入文件以制表符分隔时,Ed的回答的美妙之处在于,当替换发生时,整行输出分隔符不会“重新计算”,因为它是被替换的第一个分隔符。基于以制表符分隔的输入文件:
awk -v OFS="\t" 'NF==3{$1=$1 OFS "NULL"} 1' input.vcf
如果输入文件不是以制表符分隔的,则可以将其更改为以下内容:
awk -v OFS="\t" '{$1=$1 (NF==3 ? OFS "NULL" : "")} 1' input.vcf
在这两种情况下,当NF==3
时,将重新分配第一个字段以包含缺少的数据。在第一个示例中,只有更改行的输出分隔符需要调整,但是当数据没有制表符分隔时,在打印整行的1
之前,需要通过重新分配来“重新计算”每一行
当输入文件以制表符分隔时,Ed的回答的美妙之处在于,当替换发生时,整行输出分隔符不会“重新计算”,因为它是被替换的第一个分隔符。基于以制表符分隔的输入文件:
awk -v OFS="\t" 'NF==3{$1=$1 OFS "NULL"} 1' input.vcf
如果输入文件不是以制表符分隔的,则可以将其更改为以下内容:
awk -v OFS="\t" '{$1=$1 (NF==3 ? OFS "NULL" : "")} 1' input.vcf
在这两种情况下,当NF==3
时,将重新分配第一个字段以包含缺少的数据。在第一个示例中,只有更改行的输出分隔符需要调整,但是当数据没有制表符分隔时,在打印整行的1
之前,需要通过重新分配来“重新计算”每一行
当输入文件以制表符分隔时,Ed的回答的美妙之处在于,当替换发生时,整行输出分隔符不会“重新计算”,因为它是被替换的第一个分隔符。基于以制表符分隔的输入文件:
awk -v OFS="\t" 'NF==3{$1=$1 OFS "NULL"} 1' input.vcf
如果输入文件不是以制表符分隔的,则可以将其更改为以下内容:
awk -v OFS="\t" '{$1=$1 (NF==3 ? OFS "NULL" : "")} 1' input.vcf
在这两种情况下,当NF==3
时,将重新分配第一个字段以包含缺少的数据。在第一个示例中,只有更改行的输出分隔符需要调整,但是当数据没有制表符分隔时,在打印整行的1
之前,需要通过重新分配来“重新计算”每一行
当输入文件以制表符分隔时,Ed的回答的美妙之处在于,当替换发生时,不会“重新计算”整行输出分隔符,因为它是被替换的第一个分隔符。这对给定的数据不正确,因为它的空格是分隔的,而不是制表符是分隔的。从OPs测试来看,它似乎是分开的标签,所以我改为原来的post到标签。一些高尔夫运动:
awk-F'\t'-v OFS='\t'$2~/^RPB=/{$2=“NULL”FS$2}7'
这对于给定的数据不正确,因为它的空格是分隔的,而不是制表符分隔的。从OPs测试来看,它似乎是分开的标签,所以我改为原来的post到标签。一些高尔夫运动:awk-F'\t'-v OFS='\t'$2~/^RPB=/{$2=“NULL”FS$2}7'
这对于给定的数据不正确,因为它的空格是分隔的,而不是制表符分隔的。从OPs测试来看,它似乎是分开的标签,所以我改为原来的post到标签。一些高尔夫运动:awk-F'\t'-v OFS='\t'$2~/^RPB=/{$2=“NULL”FS$2}7'
这对于给定的数据不正确,因为它的空格是分隔的,而不是制表符分隔的。从OPs测试来看,它似乎是分开的标签,所以我改为原来的post到标签。一些高尔夫运动:awk-F