awk :вычислить вхождение элементов в заданный столбец CSV

В итоге я отключил маршрутизатор, и это решило проблему. Не то, что я мог бы сделать удаленно. Очень странная проблема и жесткая перезагрузка роутера казалась ненужной, но неизбежной на тот момент.

0
03.06.2021, 17:40
2 ответа

Использование GNU awk для массивов массивов и отсортированных _в:

$ cat tst.awk
BEGIN { FS=", *"; OFS=", " }
NR > 1 {
    cnts[1][$1]++
    cnts[2][$2]++
}
END {
    numRows = 3
    numCols = 2

    PROCINFO["sorted_in"] = "@val_num_desc"
    for (colNr=1; colNr<=numCols; colNr++) {
        rowNr = 0
        for (key in cnts[colNr]) {
            vals[++rowNr][colNr] = sprintf("%s (number of cases: %d)", key, cnts[colNr][key])
        }
    }

    print "TOP PROT", "TOP LIG"
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", vals[rowNr][colNr], (colNr<numCols ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file
TOP PROT, TOP LIG
10V1 (number of cases: 4), lig158 (number of cases: 3)
10V2 (number of cases: 3), lig662 (number of cases: 2)
3000 (number of cases: 2), lig369 (number of cases: 2)
1
28.07.2021, 11:27

Использование GNU awk

gawk -F',[[:blank:]]+' -v N=3 '
    {
        count["prot"][$1]++
        count["lig"][$2]++
    }

    function show(thing,      n, id) {
        print "TOP " toupper(thing)
        n = N
        for (id in count[thing]) {
            printf "%s (number of cases: %d)\n", id,  count[thing][id]
            if (--n == 0) break
        }
    }

    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        show("prot")
        show("lig")
    }
' file.csv | pr -2Ts$'\t' | sed 's/\t/, /'
TOP PROT, TOP LIG
10V1 (number of cases: 4), lig158 (number of cases: 3)
10V2 (number of cases: 3), lig662 (number of cases: 2)
3000 (number of cases: 2), lig369 (number of cases: 2)
2
28.07.2021, 11:27

Теги

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