【问题标题】:Counting with a complicated conditions using awk使用 awk 计算复杂条件
【发布时间】:2020-07-26 06:04:30
【问题描述】:

我有一个任务。我必须从数据中计算出内水桥和外水桥。我想告诉你我应该如何计算它们。

例如,我有一个数据文件:

MGD12   SOL54  
MGD14   SOL74    
MGD10   SOL37    
MGD16   SOL65    
MGD21   SOL66
MGD2    SOL65    
MGD64   SOL74    
MGD10   SOL37    
MGD72   SOL74    
MGD12   SOL54

内水桥在以下情况下:MGD 和 SOL 相同(重复)。外水桥是:MGD不同,但SOL相同。

比如第三栏,我写哪一行是内水桥,哪一行是外水

1.MGD12    SOL54    inner (the same in line 10)
2.MGD14    SOL74    outer (the same SOL in 7, 9)
3.MGD10    SOL37    inner (the same in line 8)
4.MGD16    SOL65    outer (the same SOL in 6)
5.MGD21    SOL66    no water bridge
6.MGD2     SOL65    outer (the same SOL in 4)
7.MGD64    SOL74    outer (the same SOL in 2, 9)
8.MGD10    SOL37    inner (the same in line 3)
9.MGD72    SOL74    outer (the same SOL in 2, 7)
10.MGD12   SOL54    inner (the same in line 1)

在输出中,我只需要内部和外部水桥的数量。在这种情况下,只有数字 4 和 5。

4 5

我尝试写一个脚本,但我不知道我应该设置什么条件,也许我应该使用数组?

#!/bin/bash
awk '{ if () inner++; else if () outer++} END { print inner " " outer}' probe.txt

编辑,我尝试使用该脚本,但它不起作用

#!/bin/bash
awk 'NR==FNR         {a[$1,$2]++; s[$2]++; next} 
       a[$1,$2]!=s[$2] {outer++; next} 
       s[$2]!=1        {inner++} 
       END             {print inner,outer}' probe.txt | tee probe2.txt

输入

MGD12   SOL54    
MGD14   SOL74    
MGD10   SOL37    
MGD16   SOL65    
MGD21   SOL66
MGD2    SOL65    
MGD64   SOL74    
MGD10   SOL37    
MGD72   SOL74    
MGD12   SOL54

在输出中我有一个空行(probe2.txt)


当我尝试另一个 scipt 时

#!/bin/bash
awk 'NR==FNR {a[$1,$2]++; s[$2]++; next} 
               {print $0, (a[$1,$2]==s[$2]?(s[$2]==1?"no":"inner"):"outer")}' probe.txt | tee probe2.txt

我的输出又是空的。

【问题讨论】:

    标签: if-statement awk text-processing


    【解决方案1】:

    双扫描方法更容易......

    $ awk 'NR==FNR {a[$1,$2]++; s[$2]++; next} 
                   {print $0, (a[$1,$2]==s[$2]?(s[$2]==1?"no":"inner"):"outer")}' file{,}
    
    MGD12   SOL54 inner
    MGD14   SOL74 outer
    MGD10   SOL37 inner
    MGD16   SOL65 outer
    MGD21   SOL66 no
    MGD2    SOL65 outer
    MGD64   SOL74 outer
    MGD10   SOL37 inner
    MGD72   SOL74 outer
    MGD12   SOL54 inner
    

    只是计数

    $ awk 'NR==FNR         {a[$1,$2]++; s[$2]++; next} 
           a[$1,$2]!=s[$2] {outer++; next} 
           s[$2]!=1        {inner++} 
           END             {print inner,outer}' file{,}
    4 5
    

    【讨论】:

    • 谢谢,我试试这个脚本,但我没有任何输出。我在编辑的第一篇文章中写了这个
    • 您错过了两次提供文件,probe.txt probe.txtprobe.txt{,}
    • 非常感谢。它完美无缺!我主要使用 file1 | tee file2 将输出写入 awk 中的另一个文件或保存修改文件 > tmp && mv tmp 文件,但我从你那里学到了新东西,你帮助我非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2017-11-04
    • 2012-12-31
    • 2019-03-11
    相关资源
    最近更新 更多