Увеличение числа больше 50 в файле

это также можно сделать с помощью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 \;

, но тогда вся точка пересечения -ссылок по имени файла будет спорной.

7
04.02.2021, 10:52
2 ответа

Ваш 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
3
18.03.2021, 22:32
  • Увеличение всех чисел с абсолютным значением больше 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на случай, если что-то пойдет не так.

8
18.03.2021, 22:32

Теги

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