使用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)

在输出中,我只想要内部和外部水桥的数量。在这种情况下,它将只是数字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

我的输出再次为空。

双扫描方法更容易。。。

$ 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

最新更新