Как поместить переменную в команду awk

Учитывая, что введенные вами данные недействительны в формате JSON, вам, вероятно, придется использовать решение типа sed, awk, grep. С этой целью следующее может иметь дело с вводом, где он был «минифицирован» в одну строку:

$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' <FILE> | grep -oP '(?<=:)"\w+"' | paste - -

Пример

$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' b.json | grep -oP '(?<=:)"\w+"' | paste - -
"1", "97"
"5", "89"
"4", "97"
"5", "97"
"1", "77"
"B", "97"
"B", "94"
"L", "34"
"J", "57"
"J", "57"
"4", "7"
"1", "97"
"5", "89"
"4", "97"
"5", "97"
"1", "77"
"B", "97"
"B", "94"
"L", "34"

Альтернативы

ПРИМЕЧАНИЕ:Они работают с многострочными входными данными -.

sed+вставить
$ sed -n '/code_ascii/,/confidence/p' a.json | sed 's/.*: [^"]*//' | paste - -
sed,awk,paste
$ sed -n '/code_ascii/,/confidence/p' a.json | awk -F': ' '{print $2}' | paste -d" " - -
sed,grep,paste
$ sed -n '/code_ascii/,/confidence/p' a.json | grep -oP '(?<=: ).*$' | paste - -
grep+вставить
$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' b.json | grep -oP '(?<=:)"\w+"' | paste - -
1
28.08.2020, 12:26
1 ответ

Учитывая некоторые данные CSV в data.csv,

A;B;C
1;2;3
4;5;6
-1.2;3;3.3

следующий сценарий будет вычислять сумму столбца, названного переменной colname, заданной в командной строке:

BEGIN {
        FS = ";"

        if (colname == "") {
                print "Did not get column name (colname) to work with" >"/dev/stderr"
                exit 1
        }
}

FNR == 1 {
        colnum = 0

        for (i = 1; i <= NF; ++i)
                if ($i == colname) {
                        colnum = i
                        break
                }

        if (colnum == 0) {
                printf "Did not find named column (colname = \"%s\")\n", colname >"/dev/stderr"
                exit 1
        }

        sum = 0
        next
}

{
        sum += $colnum
}

END {
        print sum
}

Проверка:

$ awk -v colname='A' -f script.awk data.csv
3.8
$ awk -v colname='B' -f script.awk data.csv
10
$ awk -v colname='C' -f script.awk data.csv
12.3
$ awk -v colname='D' -f script.awk data.csv
Did not find named column (colname = "D")

Укороченный вариант скрипта без такой тщательной проверки ошибок:

BEGIN { FS = ";" }

FNR == 1 {
        for (i = 1; i <= NF; ++i)
                if ($i == colname) break

        if (i > NF) exit 1
        next
}

{ sum += $i }

END { print sum }

или как «один -лайнер»:

$ awk -v colname='A' -F ';' 'FNR == 1 { for (i = 1; i <= NF; ++i) if ($i == colname) break; if (i > NF) exit 1; next } { sum += $i } END { print sum }' data.csv

Однако в идеале вы должны использовать парсер CSV, например CSVkit:

$ csvstat --sum -c A data.csv
3.8

Утилита csvstatвычисляет несколько различных статистических данных для любого файла CSV. Здесь выясняется, что разделитель ;сам по себе. В этом примере я запрашиваю сумму столбца с именем A.

0
18.03.2021, 23:09

Теги

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