Por que não consigo excluir esses itens da matriz no jq?

2

Dado o comando:

echo "[\"tag1\", \"[[Super\", \"Duppa\", \"Database\", \"Analyst]]\", \"tag2\"]" | jq -f ~/somefilter.jq

E o filtro:

def hasOne(x): x | (startswith("[[") or endswith("]]") ); 
def looparr(r): [ r | keys[] as $i | r[$i] | select(hasOne(.)) | $i ] ; 
. as $arrray | $arrray |= .+ [ . as $arr | looparr($arr) | .[0] as $str | .[1] as $ed | $arr[$str:$ed+1] | join(" ") ] | del(.[$str:$ed+1])

somefilter.jq

Por que o del(.[$str:$ed+1]) não remove as strings que eu concatenava junto em seu próprio item?

Em vez disso, recebo o seguinte erro:

jq: error: str/0 is not defined at <top-level>, line 3:
. as $arrray | $arrray |= .+ [ . as $arr | looparr($arr) | .[0] as $str | .[1] as $ed | $arr[$str:$ed+1] | join(" ") ] | del(.[$str:$ed+1])                                                                                                                               
jq: error: ed/0 is not defined at <top-level>, line 3:
. as $arrray | $arrray |= .+ [ . as $arr | looparr($arr) | .[0] as $str | .[1] as $ed | $arr[$str:$ed+1] | join(" ") ] | del(.[$str:$ed+1])

Se eu derrubar | del(.[$str:$ed+1]) no final e substituí-lo por | . ... minha saída se tornará:

[
  "tag1",
  "[[Super",
  "Duppa",
  "Database",
  "Analyst]]",
  "tag2",
  "[[Super Duppa Database Analyst]]"
]

Minha saída desejada é mais parecida com:

[
  "tag1",
  "tag2",
  "[[Super Duppa Database Analyst]]"
]

Quando eu tento adicionar constantes, funciona muito bem, mas isso não torna meu script muito maleável (e pode não ser assim mesmo neste momento).

Existe alguma razão pela qual não consigo acessar $str e $ed ?

    
por leeand00 14.06.2017 / 04:21

1 resposta

3

Eu acho que o problema é que essas variáveis estão fora do escopo, pois elas estão vinculadas dentro de um [] . Eu sou um jq neófito, mas o seguinte, que duplica o código, parece dar a resposta certa para você construir:

 . as $arr |
 looparr($arr) | 
 .[0] as $str |
 .[1] as $ed |
 $arr |
 del(.[$str:$ed+1])
+ [
 . as $arr |
 looparr($arr) | 
 .[0] as $str |
 .[1] as $ed |
 $arr[$str:$ed+1] |
 join(" ")
]
    
por 14.06.2017 / 15:30

Tags