2017-09-08 3 views
0

Comment arrondir chiffre sur la dernière colonne à 2 décimales?Comment je peux arrondir chiffre sur la dernière colonne à 2 décimales après un point en utilisant JQ?

Je JSON:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
    "total": 9, 
    "successful": 9, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 2.575364, 
    "hits": [ 
     { 
     "_index": "my-2017-08", 
     "_type": "log", 
     "_id": "AV5V8l0oDDWj-VP3YnCw", 
     "_score": 2.575364, 
     "_source": { 
      "acb": { 
      "version": 1, 
      "id": "7", 
      "owner": "pc", 
      "item": { 
       "name": "Account Average Latency", 
       "short_name": "Generate", 
       "description": "Generate of last month" 
      }, 
      "service": "gsm" 
      }, 
      "@timestamp": "2017-07-31T22:00:00.000Z", 
      "value": 210.08691986891395 
     } 
     }, 
     { 
     "_index": "my-2017-08", 
     "_type": "log", 
     "_id": "AV5V8lbE28ShqBNuBl60", 
     "_score": 2.575364, 
     "_source": { 
      "acb": { 
      "version": 1, 
      "id": "5", 
      "owner": "pc", 
      "item": { 
       "name": "Profile Average Latency", 
       "short_name": "Profile", 
       "description": "Profile average latency of last month" 
      }, 
      "service": "gsm" 
      }, 
      "@timestamp": "2017-07-31T22:00:00.000Z", 
      "value": 370.20963260148716 
     } 
     } 
    ] 
    } 
} 

J'utilise JQ pour obtenir des données csv:

["Name","Description","Result"],(.hits.hits[]._source | [.acb.item.name,.acb.item.description,.value])|@csv 

Je vois résultat:

"Name","Description","Result" 
"Account Average Latency","Generate of last month",210.08691986891395 
"Profile Average Latency","Profile average latency of last month",370.20963260148716 

Je 210,08691986891395 et 370,20963260148716 mais je veux 210,09 et 370,21

Répondre

0

je passerais à awk par pipeline:

jq -r '["Name","Description","Result"],(.hits.hits[]._source | 
     [.acb.item.name,.acb.item.description,.value])|@csv' yourfile | 
     awk 'BEGIN{ FS=OFS="," }NR>1{ $3=sprintf("%.2f",$3) }1' 

La sortie:

"Name","Description","Result" 
"Account Average Latency","Generate of last month",210.09 
"Profile Average Latency","Profile average latency of last month",370.21 
1

En fonction de votre version de JQ, vous pouvez avoir accès à certains cstdlib math functions (par exemple, sin ou cos). Puisque vous êtes sur * nix, vous le faites très probablement. Dans ma construction particulière, je ne semble pas avoir accès à round mais peut-être que vous le faites.

def roundit: .*100.0|round/100.0; 
["Name","Description","Result"], 
(.hits.hits[]._source | [.acb.item.name, .acb.item.description, (.value|roundit)]) 
    | @csv 

Heureusement, il pourrait être mis en œuvre en termes de floor que j'ai accès.

def roundit: .*100.0 + 0.5|floor/100.0; 
+0

Merci pour votre réponse. Mais je vérifie ceci et je vois une erreur: jq: erreur: rond/0 n'est pas défini à , ligne 1: def rondit:. * 100.0 | rond/100.0; ["Nom", "Description", "Résultat"], (.hits.hits [] ._ source | [.acb.item.name, .acb.item.description, .value | roundit]) | @csv jq: 1 erreur de compilation oui, j'utilise linux (jq version 1.5) –

+0

Ouais, il semblerait que 'round' ne soit pas disponible pour vous non plus. Mais nous pourrions aussi l'implémenter en termes de "plancher". Pas exactement la même chose mais serait assez proche. –

0

Voici votre filtre en cours avec reformatage mineur:

["Name", "Description", "Result"] 
, ( .hits.hits[]._source 
    | [.acb.item.name, .acb.item.description, .value] 
) 
| @csv 

est ici un filtre qui arrondit la colonne de valeur. Notez que nous le faire après la @csv afin que nous ayons un contrôle total sur la chaîne

def round:            # e.g. 
    (split(".") + ["0"])[:2]        # ["210","08691986891395"] 
    | "\(.[1])000"[:3] as $x | [.[0], $x[:2], $x[2:3]]  # ["210","08","6"] 
    | map(tonumber)           # [210,8,6] 
    | if .[2] > 4 then .[2] = 0 | .[1] += 1 else . end  # [210,9,0] 
    | if .[1] > 99 then .[1] = 0 | .[0] += 1 else . end  # [210,9,0] 
    | ["\(.[0])", "00\(.[1])"[-2:]]       # ["210","09"] 
    | join(".")            # 210.09 
; 

    ( ["Name", "Description", "Result"] | @csv) 
, ( .hits.hits[]._source 
    | [.acb.item.name, .acb.item.description, .value] 
    | @csv 
    | split(",") | .[-1] |= round | join(",") 
) 

Si ce filtre est en filter.jq et les données de l'échantillon est data.json alors la commande

$ jq -Mr -f filter.jq data.json 

produit

"Name","Description","Result" 
"Account Average Latency","Generate of last month",210.09 
"Profile Average Latency","Profile average latency of last month",370.21