JSON 파일에 간단한 문자열 매핑 적용

JSON 파일에 간단한 문자열 매핑 적용

어떻게든 명령줄에 간단한 매핑을 적용하려면 한 줄짜리 코드가 있어야 한다고 생각합니다. 이 경우 JSON의 키는 (평소와 같이) 컨텍스트를 제공하여 우리가 대체해서는 안되는 문자열을 어리석게 대체하지 않도록 보장합니다.

JSON 파일을 사용하여 라이브러리 디렉터리가 제공되었다고 가정합니다. 듀이 십진분류

[
  {
    "Title": "Design Pattern",
    "Call Number": "005.12 DES"
  },
  {
    "Title": "Intro to C++",
    "Call Number": "005.133 C STR"
  }
]

그리고 듀이와 국회 도서관 전화 번호

[
  {
    "Dewey": "005.12 DES",
    "Congress": "QA76.64 .D47 1995X"
  },
  {
    "Dewey": "005.133 C STR",
    "Congress": "QA76.73.C153 S77 2013"
  }
]  

출력 파일을 생성하고 싶습니다.

[
  {
    "Title": "Design Pattern",
    "Call Number": "QA76.64 .D47 1995X"
  },
  {
    "Title": "Intro to C++",
    "Call Number": "QA76.73.C153 S77 2013"
  }
]

jq처리될 단일 행 변환 세트에 여전히 적합합니까?

답변1

다음 jq명령:

jq -s '[
    JOIN(
        INDEX(.[0][]; ."Call Number");
        .[1][];
        .Dewey;
        { Title: .[1].Title, "Call Number": .[0].Congress }
    )
]' catalog dewey_mappings

이것은 like 및 를 사용하여 두 개의 파일을 별도로 배열로 읽습니다 .[0]..[1]jq -s

색인은 첫 번째 파일의 필드를 기반으로 Call Number계산 됩니다. 이 인덱스는 두 번째 파일의 필드 JOIN에 대한 관계 연산을 수행하는 데 사용됩니다 .Dewey

추출된 요소 쌍에서 두 번째 파일의 필드에서 필드를 가져오고 첫 번째 파일의 필드에서 필드를 가져오는 JOIN객체를 만듭니다. 생성된 모든 객체는 배열(so 및 around )에 배치됩니다.TitleTitleCall NumberCongress[]JOIN

결과는 다음과 같은 JSON 문서가 됩니다.

[
  {
    "Title": "Design Pattern",
    "Call Number": "QA76.64 .D47 1995X"
  },
  {
    "Title": "Intro to C++",
    "Call Number": "QA76.73.C153 S77 2013"
  }
]

또한 "SQL 스타일 연산자"라는 제목의 매뉴얼 섹션을 참조하세요 jq.


Dewey 맵 파일을 인덱스로 사용하고 디렉터리의 Dewey 코드를 사용하여 쿼리하는 것이 더 자연스럽게 느껴질 것입니다.

jq -s '[
    JOIN(
        INDEX(.[0][]; .Dewey);
        .[1][];
        ."Call Number";
        { Title: .[0].Title, "Call Number": .[1].Congress }
    )
]' dewey_mappings catalog

관련 정보