source

jq: 객체의 각 엔트리에 대한 인쇄 키와 값

gigabyte 2023. 3. 10. 22:03
반응형

jq: 객체의 각 엔트리에 대한 인쇄 키와 값

어떻게 하면 jq가 json을 이렇게 받아들이게 할 수 있을까요?

{
  "host1": { "ip": "10.1.2.3" },
  "host2": { "ip": "10.1.2.2" },
  "host3": { "ip": "10.1.18.1" }
}

다음 출력을 생성합니다.

host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1

포맷에는 관심이 없지만 키 이름과 값에 액세스하는 방법을 알 수 없습니다.

최상위 키를 스트림으로 가져오려면 내장 함수를 사용할 수 있습니다. keys[]따라서 특정 문제에 대한 한 가지 해결책은 다음과 같습니다.

jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"' 

keys키 이름을 정렬된 순서로 생성합니다.원래 순서로 작성하려면 , 를 사용합니다.keys_unsorted.

키를 원래 순서로 생성하는 또 다른 방법은 다음과 같습니다.

jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'

CSV 및 TSV 출력

여기서 @csv 및 @tsv 필터도 검토할 필요가 있습니다.

jq -r 'to_entries[] | [.key, .value.ip] | @tsv'

생산:

host1   10.1.2.3
host2   10.1.2.2
host3   10.1.18.1

임베디드 오브젝트

다음 예시와 같이 대상 키가 포함되어 있는 경우 jq 필터를 표시된 행에 따라 변경해야 합니다.

입력:

{
  "myhosts": {
    "host1": { "ip": "10.1.2.3" },
    "host2": { "ip": "10.1.2.2" },
    "host3": { "ip": "10.1.18.1" }
  }
}

변경:

jq -r '.myhosts | keys[] as $k | "\($k), \(.[$k] | .ip)"'

매우 우아한 솔루션을 발견하다

jq 'with_entries(.value |= .ip)'

어떤 출력

{
  "host1": "10.1.2.3",
  "host2": "10.1.2.2",
  "host3": "10.1.18.1"
}

다음은 jqplay 스니펫입니다.https://jqplay.org/s/Jb_fnBveMQ

함수with_entries오브젝트 리스트의 각 오브젝트를 키/값 쌍으로 변환하기 위해.key또는.value각각 KV 항목마다 업데이트(덮어쓰기)하고 있습니다..value현장에서의.ip업데이트를 사용하여|=교환입니다.

언급URL : https://stackoverflow.com/questions/34226370/jq-print-key-and-value-for-each-entry-in-an-object

반응형