Условный не работает правильно при печати значений элементов? - PullRequest
0 голосов
/ 02 июня 2019

Попытка печати данных, отформатированных определенным образом, но условие не работает правильно.

Я написал простой тест:

jq -r ". | if (.[].nickname | length) >15 then \"\(.[].nickname)\t\(.[].fingerprint)\" else \"no\" end" running.json

Где running.json - это образец json:

[
  {
    "nickname": "FiverInstitute11",
    "fingerprint": "0011BD2J8D3J45D984EC4159C88FC066E5E3300E",
  },
  {
    "nickname": "Something13",
    "fingerprint": "0077BCBA7244DB3E6O2AD274H886170066684887",
  },
  {
    "nickname": "je8gvke8s2ff063CMbc",
    "fingerprint": "00B87ECU71DBF56805NE8469BAF3924A13AD7",
  },
  {
    "nickname": "test931",
    "fingerprint": "00DC112F7D469AD7E0E4B378D050490811BB20E5",
  }
]

Выходные данные никогда не выдают «нет», даже если условие является ложным. Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 02 июня 2019
  1. Пример данных не совсем корректен в формате JSON.Далее я предположил, что лишние запятые могут быть удалены.

  2. Первый компонент (.) вашего конвейера безвреден, но не нужен.

  3. При каждом появлении. [] Массив расширяется, поэтому, когда вы пишете что-то вроде if .[] ..., это похоже на цикл for.Таким образом, ваша jq-программа фактически имеет цикл for внутри цикла for внутри цикла for.

Возможно, вы имели в виду:

.[]
| if (.nickname | length) > 15 then "\(.nickname)\t\(.fingerprint)" 
  else "no"
  end

Отладка ваших собственных программ

Полезным инструментом отладки является фильтр debug.Это как tee /dev/stderr.Вы можете использовать столько, сколько захотите, но в данном случае вы можете начать с:

if (.[].nickname | length) >15 | debug
then "\(.[].nickname)\t\(.[].fingerprint)"
else "no" 
end

Если вы хотите, чтобы в вашей программе было более одного debug, иногда полезно использовать вспомогательныефункционировать так:

def mydebug(msg): (msg|debug) as $debug | . ;
...