Назначение групп на основе списка парных значений между всеми отдельными записями групп

Список поддерживаемых скоростей:

dmidecode | awk '/^\t[^\t]/ { speeds = 0 }; /^\tSupported Speeds:/ { speeds = 1 } /^\t\t/ && speeds'

Это работает путем сопоставления строк следующим образом:

  • строк, начинающихся с одной табуляции, означают, что мы не ожидаем скорости;
  • строки, начинающиеся с одной вкладки, за которой следует «Поддерживаемые скорости :», означают, что мы ожидаем скоростей;
  • Строки
  • , начинающиеся с двух вкладок, когда мы ожидаем скорости, выводятся так же, как и -.
1
26.09.2021, 07:19
1 ответ

На основе одной из возможных интерпретаций ваших требований и использования любого awk в любой оболочке на каждой машине Unix:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    grp = ""
    for ( i=1; i<=NF; i++ ) {
        if ( $i in val2grp) {
            grp = val2grp[$i]
            break
        }
    }
    if ( grp == "" ) {
        grp = ++grps
    }
    for ( i=1; i<=NF; i++ ) {
        if ( !($i in val2grp) ) {
            val2grp[$i] = grp
        }
    }
    printf "%s%sgroup%02d\n", $0, OFS, grp
}

$ awk -f tst.awk pairs.tsv
a       b       group01
c       d       group02
e       f       group03
e       g       group03
h       i       group04
h       j       group04
k       l       group05
f       g       group03
m       n       group06
i       j       group04

Примите во внимание этот ввод:

$ cat pairs2.tsv
a       b
c       b
d       c

Является ли следующий ожидаемым результатом или нет:

$ awk -f tst.awk pairs2.tsv
a       b       group01
c       b       group01
d       c       group01

Если нет, то почему? В строке 1 bназначается group01, затем bтакже присутствует в строке 2, так что это также должно быть group01, что означает, что cнаходится в group01, затем в строке 3 cуже находится в group01из строки 2, поэтому вся строка 3 (, а такжеd)затем связаны с group01.

0
27.09.2021, 16:12

Теги

Похожие вопросы