下面的awk
适用于input1
(当所有必填字段都存在且具有值时)。 Exception
fied根据if
中的awk
语句进行更新。
它不适用于input2
或input3
(其中存在所有必填字段但不预期值)。只有两个不能包含数值的字段是Barcode2
和Barcode3
。大部分时间他们会,但当他们不在时,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
答案 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
,&&
等一般编程基础知识, ||
等等。