繁体   English   中英

使用 awk 在复杂条件下进行计数

[英]Counting with a complicated conditions using awk

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

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

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)

在 output 中,我只想要内外水桥的数量。 在这种情况下,它将只有数字 4 和 5。

4 5

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

#!/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

在 output 我有一个空行(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

我又空了 output。

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

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM