awk将根据if语句更新字段,除非关键字位于字段中

awk将根据if语句更新字段,除非关键字位于字段中,awk,Awk,下面的awk非常适合input1(当所有必填字段都存在且具有值时)。根据awk中的if语句更新异常。 它不适用于input2或input3(其中所有必填字段都存在,但不需要值)。只有两个字段不能包含数值,它们是Barcode2和Barcode3。大多数情况下,它们会出现,但当它们不存在时,单词missing就是值。我的问题是,当这两个字段中的任何一个或其中一个缺失时,可以跳过该字段或在if语句中不使用该字段。我不知道该怎么做或在哪里做。谢谢:) 输入制表符分隔——条形码2和条形码3“缺失” 脚本

下面的
awk
非常适合
input1
(当所有必填字段都存在且具有值时)。根据
awk
中的
if
语句更新
异常。
它不适用于
input2
input3
(其中所有必填字段都存在,但不需要值)。只有两个字段不能包含数值,它们是
Barcode2
Barcode3
。大多数情况下,它们会出现,但当它们不存在时,单词
missing
就是值。我的问题是,当这两个字段中的任何一个或其中一个
缺失时,可以跳过该字段或在
if
语句中不使用该字段。我不知道该怎么做或在哪里做。谢谢:)

输入
制表符分隔
——条形码2和条形码3“缺失”

脚本

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
输入的所需输出
制表符分隔的
应传入异常,因为未使用缺少的字段

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

你是在问,如果一个字段不包含“missing”这个词,如何只对它进行比较?而不是:

if ( $f["Barcode1"] < 20000000 ||
     $f["Barcode2"] < 2000000  ||
     $f["Barcode3"] < 2000000 )
         $f["Exception"] = "Failure due to low barcode reads"
if($f[“条形码1”]<20000000||
$f[“条形码2”]<2000000||
$f[“条形码3”]<2000000)
$f[“异常”]=“由于条形码读取量低而失败”
这样做:

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"
if($f[“条形码1”]!=“缺少”&&f[“条形码1”]<20000000)||
($f[“条形码2”]!=“缺失”&&$f[“条形码2”]<2000000)||
($f[“条形码2”!=“缺失”&&$f[“条形码3”]<2000000))
$f[“异常”]=“由于条形码读取量低而失败”
还要注意使用空格和缩进使代码更具可读性


我强烈建议您阅读Arnold Robbins的《有效的Awk编程》,第四版,因为它不仅可以教您Awk语言,而且可以帮助您掌握一般编程基础知识,如
if
&&
|
,等等。

请编辑您的Q,以显示您当前的输出以及样本输入的所需输出。口头描述几乎总是导致评论中出现“哦,我指的是X1,不是X”的讨论链。祝你好运,你会成功的。我看到输入2/3的两组
电流输出,我不想猜测哪个是所需的输出。请更新您的Q。另外,您的问题似乎与
&&
ed条件逻辑有关,而像
NR>1{…}
这样的模式匹配块在这方面没有太大帮助。你知道处理所有行的更一般的构造吗,例如,e
awk-F,'{if(cond1&&cond2&&….| altCond….){Do stuff}else if(cond7&&cond8){other stuff}else{more stuff}文件
?祝你好运。我编辑了这篇文章,清理了输出内容,并试图更简洁地回答这个问题@庇护所我不知道那个建筑。。。谢谢:).arg,我知道这一定会让您感到沮丧,但现在您的Q中删除了太多内容。我们需要最少的样本数据、代码、当前输出、预期输出和错误消息,以便我们可以复制/粘贴到终端窗口中,并在不到1分钟的时间内重现您的问题。由于您的
..$f[“Barcode1”]<20000000 | |$f[“Barcode2”]<2000000 | | |$f[“Barcode3”]<2000000)
测试似乎没有如您所期望的那样工作,请使用示例数据编辑您的Q,其中包含一条应通过该测试的记录,以及一条将进入
else
块的记录。虽然我们需要标题的设置,但是您真的需要9-10列来了解它的工作原理吗?将示例减少到4-5个字段(您仍然可以一次测试3个字段)。你可以自己解决你的问题。如果没有,发布你修改后的当前输出和预期输出,我们会让它为你工作。坚持下去,你就快到了(这就是塑造性格!;-)。祝你好运
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"