【问题标题】:Conditional awk command printing the 'else' statement only once仅打印一次“else”语句的条件 awk 命令
【发布时间】:2021-08-04 21:35:16
【问题描述】:

为令人困惑的标题道歉。我想使用条件 awk 语句处理柱状文件。基本上,如果在第 2 列中找到数字 27606,我想打印 length($4)-length($5),否则如果在第 2 列中找不到 27606,我想打印一次“0”。

考虑present.txt:

First   11111   Third   ABCDE   A
First   27606   Third   ABCDE   A
First   22222   Third   ABCDE   A
First   33333   Third   ABCDE   A
First   44444   Third   ABCDE   A

和absent.txt:

First   11111   Third   ABCDE   A
First   55555   Third   ABCDE   A
First   22222   Third   ABCDE   A
First   33333   Third   ABCDE   A
First   44444   Third   ABCDE   A

对于present.txt,输出应该是:4。 对于absent.txt,输出应该是:0。

我尝试了以下方法:

awk '{if ($2 ~ /27606/){print length($4)-length($5)} else { print "0" }}' file

通过为present.txt 打印“4”以我想要的方式“工作”,然而它为 每一行打印 0,其中没有 27606 absent.txt... 中的第 2 列输出:

0
0
0
0
0

我也试过了:

awk '$2 ~ /27606/ {found=1} END {if (!found) print "0"} {if (found) print length($4)-length($5)}' file

这适用于absent.txt:“0”只打印一次。然而,对于present.txt,length($4)-length($5) 将打印在 $2 列中匹配 27606 的第一行以及随后的每一行。输出:

4
4
4
4

我可以使用什么命令使present.txt 的输出为'4',而absent.txt 的输出为'0'?谢谢!

【问题讨论】:

    标签: awk


    【解决方案1】:

    找到值后,打印出您的计算值并增加一个计数器。如果计数器为 0,则在 END 块中打印 0:

    awk '$2 == 27606 { print length($4) - length($5); found++ }
         END { if (!found) print 0 }' input.txt
    

    如果你想只输出一个数字,即使该值被多次找到:

    awk '$2 == 27606 && !found { print length($4) - length($5); found++ }
         END { if (!found) print 0 }' input.txt
    

    【讨论】:

    • 太棒了,谢谢! (我会在 6 分钟内接受你的回答...)
    【解决方案2】:

    听起来 27606 最多只能出现在 1 行,所以您只需要:

    $ awk '$2==27606{diff=length($4)-length($5); exit} END{print diff+0}' present.txt
    4
    
    $ awk '$2==27606{diff=length($4)-length($5); exit} END{print diff+0}' absent.txt
    0
    

    【讨论】:

    • 我最终扩展了运行此代码的最终目标,对于新的用法,答案 1 效果更好。但是,根据我在这个问题中提出的问题,您的解决方案效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2022-01-13
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多