Подсчет в сложных условиях с использованием awk - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть задача. Я должен рассчитывать внутренние и внешние водные мосты из данных. Я хочу показать вам, как мне их считать.

Например, у меня есть файл данных:

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

input

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

На выходе у меня пустая строка (probe2.txt) )


Когда я пробую другой сценарий

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

У меня снова пустой вывод.

1 Ответ

1 голос
/ 13 апреля 2020

метод двойного сканирования проще ...

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...