어떻게든 명령줄에 간단한 매핑을 적용하려면 한 줄짜리 코드가 있어야 한다고 생각합니다. 이 경우 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 )에 배치됩니다.Title
Title
Call Number
Congress
[
]
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