awk基于if语句更新字段,除非关键字在字段中

时间:2017-05-05 12:51:59

标签: awk

下面的awk适用于input1(当所有必填字段都存在且具有值时)。 Exception fied根据if中的awk语句进行更新。 它不适用于input2input3(其中存在所有必填字段但不预期值)。只有两个不能包含数值的字段是Barcode2Barcode3。大部分时间他们会,但当他们不在时,missing这个词就是价值。我的问题是,当这两个字段中的任何一个字段或其中一个字段为missing时,该字段可以在if语句中跳过或不使用。我不知道如何或在哪里这样做。谢谢你:)。

输入 tab-delimited ---条形码2和条形码3"缺少"

Barcode1    Barcode2    Barcode3    NoBarcode   Exception
38774136    missing     missing     0.89

脚本

awk '
BEGIN { # Set input and output field separator:
    FS = OFS = "\t"
}

NR == 1 {# Search line 1 of file
    # Create array to tranlate needed field headers to field numbers:
    for(i = 1; i <= NF; i++) {
        f[$i] = i
    }
    next
}

{
    if($f["Barcode1"] < 20000000 ||
       $f["Barcode2"] < 2000000 ||
       $f["Barcode3"] < 2000000) {
        $f["Exception"] = "Failure due to low barcode reads"
    }
    else {
        $f["Exception"] = "Pass"
    }
    print
}
' input

输入 tab-delimited的当前输出应该是Pass in Exception,因为未使用缺少的字段

Barcode1    Barcode2    Barcode3    NoBarcode   Exception
38774136    missing     missing     0.89     Failure due to low barcode reads

输入 tab-delimited的所需输出应为异常传递,因为未使用缺少的字段

Barcode1    Barcode2    Barcode3    NoBarcode   Exception
38774136    missing     missing     0.89        Pass

1 个答案:

答案 0 :(得分:2)

如果字段中不包含“缺失”一词,您是否只想询问如何对字段进行比较?而不是:

if ( $f["Barcode1"] < 20000000 ||
     $f["Barcode2"] < 2000000  ||
     $f["Barcode3"] < 2000000 )
         $f["Exception"] = "Failure due to low barcode reads"

这样做:

if ( ($f["Barcode1"] != "missing" && $f["Barcode1"] < 20000000) ||
     ($f["Barcode2"] != "missing" && $f["Barcode2"] < 2000000)  ||
     ($f["Barcode2"] != "missing" && $f["Barcode3"] < 2000000) )
         $f["Exception"] = "Failure due to low barcode reads"

还要注意使用空格和缩进来使代码更具可读性!

我强烈建议您阅读Arnold Robbins撰写的有效Awk编程,第4版,因为它不仅会教您awk语言,还会帮助您了解if&&等一般编程基础知识, ||等等。