Awk再添加一列是第三列等于字符串

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

我有一个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  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";
        }
    }'
说明:

  • 上面的代码创建了一个二维数组(行/字段)
  • 它还存储max_字段
  • 对于每行,如果字段数小于最大字段数,则插入“NULL” a争吵的开始

  • 如果不应该使用正则表达式,请尝试以下方法:

    #!/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";
            }
        }'
    
    说明:

  • 上面的代码创建了一个二维数组(行/字段)
  • 它还存储max_字段
  • 对于每行,如果字段数小于最大字段数,则插入“NULL” a争吵的开始

  • 如果不应该使用正则表达式,请尝试以下方法:

    #!/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";
            }
        }'
    
    说明:

  • 上面的代码创建了一个二维数组(行/字段)
  • 它还存储max_字段
  • 对于每行,如果字段数小于最大字段数,则插入“NULL” a争吵的开始

  • 如果不应该使用正则表达式,请尝试以下方法:

    #!/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";
            }
        }'
    
    说明:

  • 上面的代码创建了一个二维数组(行/字段)
  • 它还存储max_字段
  • 对于每行,如果字段数小于最大字段数,则插入“NULL” a争吵的开始
  • 这个改动最小的版本会产生您想要的输出:

    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