Учитывая, что введенные вами данные недействительны в формате 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 - -
Учитывая некоторые данные 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
.