это также можно сделать с помощьюjtc
в одной строке:
bash $ cat xyz.json | jtc -w'[-1][annotations]' -eu jtc -w'[-1][annotations]' xyz.json \;
[
{
"annotations": [
"a",
"b",
"c"
],
"class": "image",
"filename": "vc00_02201.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02202.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02203.png"
},
{
"annotations": [
"a",
"b",
"c"
],
"class": "image",
"filename": "vc00_02204.png"
}
]
bash $
Конечно, это можно было сделать с помощью прямой ссылки на элементы массива, например:
bash $ cat xyz.json | jtc -w'[3][annotations]' -eu jtc -w'[0][annotations]' xyz.json \;
, но тогда вся точка пересечения -ссылок по имени файла будет спорной.
Ваш awk
был почти прав, но вы хотите чередовать поле, а затем напечатать всю строку. Кроме того, разделитель полей вывода просто удален, а недостающая запятая и закрывающие скобки добавлены вручную :
awk 'BEGIN {FS="[,)]" ; OFS="" } /ByteField/ && $2 > 50 {$2=", "$2+1")"} ; 1' file
Где 1
всегда верно, поэтому всегда печатается строка (для всех строк)-обратите внимание, что это необходимо сделать после того, как вы изменили поле. Я добавил соответствие для /ByteField/
для большей надежности.
Для замены файла :Избыточное cat
и конвейерное соединение с командой, которая имеет тот же файл, что и выходной файл, прервется. Используйте другие подходы. Например.
С GNU awk
awk -i inplace 'BEGIN....' file
С губкой
awk 'BEGIN...' file | sponge file
Или с помощью временного файла
awk 'BEGIN...' file > file.alt
mv file.alt file
Увеличение всех чисел с абсолютным значением больше 50.
perl -pe 's/\b(\d+)\b/$1>50 ? $1+1 : $1/ge' file
Шаблон представляет собой последовательность цифр(\d+
)с границами (\b
), чтобы он не совпадал с номер 4
в set4ByteField
, например. Флагe
в конце команды позволяет рассматривать замену как выражение, т.е. троичное выражение для захваченной группы .
Увеличение всех чисел больше 50.
perl -pe 's/(^|[^-])\b(\d+)\b/$1.($2>50 ? $2+1 : $2)/ge' file
^|[^-]
соответствует началу строки или любому символу, кроме дефиса -минус слева от последовательности цифр. Это исключает отрицательные числа.
Кстати, не стоит писать в файл и читать из него одновременно время. Ваша попытка обрезает файл до его обработки, поэтому вы получаете пустой файл. Чтобы отредактировать файл на месте, используйте флаг Perl -i
(, см. команда -параметры строки). Еще лучше, -i.bak
сохраняет исходный файл с расширением .bak
на случай, если что-то пойдет не так.