2017-05-19 44 views
4

我有以下文件如何獲得每個迭代換行符在JQ

[ 
    { 
    "id": 1, 
    "name": "Arthur", 
    "age": "21" 
    }, 
    { 
    "id": 2, 
    "name": "Richard", 
    "age": "32" 
    } 
] 

要顯示的登錄名和ID一起,我使用下面的命令

$ jq '.[] | .name' test 
"Arthur" 
"Richard" 

但是,當我把它放在一個shell腳本,並嘗試將其分配給一個變量,然後整個輸出顯示在下面的單行上

#!/bin/bash 

names=$(jq '.[] | .name' test) 
echo $names 

$ ./script.sh 
"Arthur" "Richard" 

我希望在每次迭代時都能夠在命令行上工作。

請幫您提供的信息

夫婦的 問題
+0

後的代碼你如何試圖在一個變量 – Inian

+0

來存儲我已經編輯我的問題,並添加腳本以及 – user3198755

+1

順便說一句:單行輸出的原因是,你沒在'echo $ names'中''雙引號'$ names',這使得shell應用了分詞。試試'echo「$ names」'。 – mklement0

回答

4

jq篩選器.[] | .login, .id將不會生成您在jq-1.5上聲稱的輸出。爲了您的原來JSON

{ 
    "login":"dmaxfield", 
    "id":7449977 
} 
{ 
    "login":"stackfield", 
    "id":2342323 
} 

這將產生四個行作爲輸出,

jq -r '.login, .id' < json 
dmaxfield 
7449977 
stackfield 
2342323 

如果您有興趣並排存放他們身邊,你需要做的變量替換爲

jq -r '"\(.login), \(.id)"' < json 
dmaxfield, 7449977 
stackfield, 2342323 

如果你覺得你的輸出存儲在一個變量不起作用。這可能是因爲您試圖在shell中打印變量時缺少雙引號。

jqOutput=$(jq -r '"\(.login), \(.id)"' < json) 
printf "%s\n" "$jqOutput" 
dmaxfield, 7449977 
stackfield, 2342323 

這樣在命令輸出的嵌入的新線是由shell吞噬。


你(相比於舊的完全新的一個)更新JSON,所有你需要做的是

jqOutput=$(jq -r '.[] | .name' < json) 
printf "%s\n" "$jqOutput" 
Arthur 
Richard 
+1

它像魅力一樣工作。非常感謝你 – user3198755

+0

@ user3198755:回覆更新到你更新的'JSON'。感謝並樂意幫助! – Inian

0

萬一的.login或.ID包含嵌入的空格或其他字符可能導致問題,更可靠的方法是確保每個JSON值都在一個單獨的行上。舉個例子:

jq -c .login,.id input.json | while read login ; do read id; echo login="$login" and id="$id" ; done 
login="dmaxfield" and id=7449977 
login="stackfield" and id=2342323