web-dev-qa-db-ja.com

JSON配列の数値の小数位を削除する方法は?

次のようなJSONファイルの数値からすべての小数点以下の桁数を効率的に取り除くために、bashスクリプトのどのシェルコマンドを発行できますか。

    [
        {
            "IMSKU": "1000001", 
            "AttributeID": 7332.0, 
            "Value": "McAfee Host Intrusion Prevention for Desktops safeguards your business against complex security threats that may otherwise be unintentionally introduced or allowed by desktops and laptops. Host Intrusion Prevention for Desktops is easy to deploy, configure, and manage.", 
            "Unit": null, 
            "StoredValue": null, 
            "StoredUnit": null, 
            "Name": "Marketing text", 
            "Format": "1", 
            "Position": "1", 
            "Group_Name": "Basic Specification", 
            "AGGroup_Position": 0.0, 
            "Product_Hierarchy": 15198001453.0
        }, 
        {
            "IMSKU": "1000001", 
            "AttributeID": 7343.0, 
            "Value": "May 2013", 
            "Unit": null, 
            "StoredValue": null, 
            "StoredUnit": null, 
            "Name": "PI Date", 
            "Format": "1", 
            "Position": "1", 
            "Group_Name": "PI DATE", 
            "AGGroup_Position": 1.0, 
            "Product_Hierarchy": 15198001453.0
        }, 
        {
            "IMSKU": "1000001", 
            "AttributeID": 7344.0, 
            "Value": "McAfee", 
            "Unit": null, 
            "StoredValue": "0.00", 
            "StoredUnit": null, 
            "Name": "Brand Name", 
            "Format": "3", 
            "Position": "1", 
            "Group_Name": "PRODUCT", 
            "AGGroup_Position": 2.0, 
            "Product_Hierarchy": 15198001453.0
        }
    ]

そのため

"AttributeID":  7344.0

なるだろう

"AttributeID":  7344

たとえば、など。

4
ptrcao

jqを使用してIDフィルターを実行するだけで、.0 10進数が整数として含まれる数値が再フォーマットされます。

$ jq . file.json
[
  {
    "IMSKU": "1000001",
    "AttributeID": 7332,
    "Value": "McAfee Host Intrusion Prevention for Desktops safeguards your business against complex security threats that may otherwise be unintentionally introduced or allowed by desktops and laptops. Host Intrusion Prevention for Desktops is easy to deploy, configure, and manage.",
    "Unit": null,
    "StoredValue": null,
    "StoredUnit": null,
    "Name": "Marketing text",
    "Format": "1",
    "Position": "1",
    "Group_Name": "Basic Specification",
    "AGGroup_Position": 0,
    "Product_Hierarchy": 15198001453
  },

(etc.)

ゼロではない小数の数値があり、それらも削除したい場合は、

jq '(.. | select(type == "number" )) |= floor' file.json

これにより、データ内のすべての数値にfloor関数が適用され、最も近い整数に切り捨てられます。

最後のドットの後に数字を含む文字列があるかどうかを調査し、これらの数字(およびドット)を削除するには:

jq '(.. | select(type == "string")) |= sub("\\.[0-9]+$"; "")' file.json

影響を受けるエントリは依然として文字列であり、数値型に変換されません。

11
Kusalananda