2017-05-05 114 views
1

以下awk对于input1(当所有必填字段都存在且具有值时)都很适用。根据awk中的if语句更新Exception。 它不适用于input2input3(其中所有必填字段都存在但该值不是预期的)。唯一的两个字段中不能有数字值是Barcode2Barcode3。大多数时候他们会,但是当他们不存在时,这个词是missing。我的问题是,当这两个字段中的任何一个或其中一个是missing时,那么该字段可以在if语句中被跳过或不使用。我不知道如何或在哪里做到这一点。谢谢 :)。awk根据if语句更新字段,除非关键字在字段中

输入tab-delimited ---条形码2和Barcode3都 “失踪”

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电流输出应该是在传递异常的缺失字段不使用

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

请编辑您的Q以显示您当前的输出以及样本输入中的必需输出。在评论中,口头描述几乎总是导致“哦,我的意思是X1,而不是X”的讨论链。祝你好运。 – shellter

+0

我将当前输出添加到帖子中。谢谢 :)。 – Chris

+1

你到达那里。我看到2组“输入2/3”的电流输出,我不想猜测哪个是期望的输出。请更新你的问题。另外,你的问题似乎与'&&'ed条件逻辑有关,像'NR> 1 {...}'这样的模式匹配块并没有太多帮助。你知道处理所有行的更一般的结构,ie.e awk -F,{if(cond1 && cond2 && .... || altCond ....){do stuff} else if(cond7 && cond8){other stuff}} else {more stuff}}'file'?祝你好运。 – shellter

回答

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" 

还要注意使用空格和缩进,使代码更易读!

我强烈建议你读的书有效AWK编程,第4版,由阿诺德·罗宾斯,因为它不仅会教你的AWK语言,但将帮助通用编程基础知识像if&&||