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

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

4 5

我试着写一个脚本,但我不知道我应该在条件中放什么,也许我应该使用数组?

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

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

#!/bin/bash
awk 'NR==FNR         {a[,]++; s[]++; next} 
       a[,]!=s[] {outer++; next} 
       s[]!=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[,]++; s[]++; next} 
               {print [=17=], (a[,]==s[]?(s[]==1?"no":"inner"):"outer")}' probe.txt | tee probe2.txt

我的输出又是空的。

双扫描方法更容易...

$ awk 'NR==FNR {a[,]++; s[]++; next} 
               {print [=10=], (a[,]==s[]?(s[]==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[,]++; s[]++; next} 
       a[,]!=s[] {outer++; next} 
       s[]!=1        {inner++} 
       END             {print inner,outer}' file{,}
4 5