簡體   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