jq를 통해 수천 개의 거대한 json 파일 연결

jq를 통해 수천 개의 거대한 json 파일 연결

다음과 같은 수천 개의 JSON 파일이 있습니다.

파일 1( key1:value_list1)

{"2mac:acg":["1-248","3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43"]}

파일 2( key2:value_list2)

{"4qld:aaa":["3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43","19-55"]}

파일 3( key3:value_list3)

{"6k8h:c":["1-248","2-134","3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43"]}

이 파일들을 하나로 병합하고 싶습니다. 다음과 같아야 합니다.

{"2mac:acg":["1-248","3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43"], "4qld:aaa":["3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43","19-55"], "6k8h:c":["1-248","2-134","3-245","3-246","4-245","4-246","5-245","5-246","6-243","6-245","6-246","6-247","6-296","7-245","7-295","7-296","8-236","8-239","8-240","8-294","8-295","8-296","9-235","9-236","9-239","9-294","10-293","10-294","10-295","11-15","11-16","11-293","11-294","12-16","12-290","12-291","12-292","12-293","12-294","13-25","13-26","13-27","13-28","13-290","13-292","13-293","14-24","14-25","14-26","14-27","14-290","15-24","15-25","16-24","16-25","16-233","16-234","16-235","17-22","17-23","17-24","17-25","17-59","17-233","17-234","17-235","18-22","18-23","18-24","18-25","18-43","18-213","18-214","18-215","18-229","18-230","18-232","18-233","18-234","19-42","19-43"]}

연결 모델은 다음과 같아야 합니다.{key1:value_list_1, key2:value_list2, key3:value_list3,...,key_last:value_list_last}

@thanasisp 덕분에 jq를 사용하여 jq -s 'add' file1 file2 file3 을 통해 연결합니다. 수백 개의 파일을 연결할 때 효과적입니다. 그러나 수천 개의 파일이 있으면 작동하지 않고 다음과 같은 오류 메시지가 표시됩니다. 매개변수 목록이 너무 깁니다. 그래서 이 문제를 해결하는 방법과 다른 방법이 있는지 알고 싶습니다. 감사해요! 추신: 서버에 메모리가 충분합니다.

답변1

jq -c -s add file*

그러면 file*패턴과 일치하는 모든 파일을 로 읽습니다 jq. -s( ) 옵션을 사용 --slurp하면 모든 입력 파일에서 단일 배열이 생성됩니다. 이 큰 배열의 각 요소는 파일 중 하나의 개체입니다. 배열 요소가 함께 결합되어 add객체를 형성합니다.

-c옵션은 jq"컴팩트" 출력을 생성합니다.

파일이 너무 많으면 명령줄의 최대 허용 길이를 초과하므로 쉘이 명령을 실행할 수 없습니다.

이 경우 명령이 처리할 findJSON 개체 스트림을 생성 할 수 있습니다.jq

find . -name '*.json' -type f -exec cat {} + | jq -c -s add >final

from을 사용하여 cat입력 파일( find이름이 현재 디렉터리 또는 현재 디렉터리로 끝나는 일반 파일)에서 JSON 개체 스트림을 생성합니다. .jsonjq명령은 이를 배열로 수집한 다음 이전과 같이 객체로 결합합니다. 최종 결과는 파일로 출력됩니다 final.

키(두 개 이상의 파일에 있는 동일한 키) 간에 충돌이 있는 경우 마지막으로 발견된 키와 해당 값이 이전 키와 해당 값을 덮어씁니다.

답변2

jq가 필요하지 않은 것 같습니다. 마지막 파일을 제외한 모든 항목에서 후행 항목을 바꾸고 }첫 번째 파일을 제외한 모든 항목에서 선행 항목을 제거하면 됩니다 ,.{

존재하다 zsh:

autoload zargs
files=( *.json(Nn) )            # here sorted numerically or:
files=( ${(f)"$(<file.list)"} ) # to read the list one per line from
                                # a file.list
case $#files in
  (1) cat -- $files;;
  (<2->)
    sed -- 's/}$/,/' $files[1]
    zargs -r -- $files[2,-2] -- sed -- 's/^{//; s/}$/,/'
    sed -- 's/^{//' $files[-1]
esac > result.json

(결과를 한 줄에 표시하려면 |paste -sd '\0' -앞에 삽입하십시오.)>

또는 먼저 연결하고 결과에 대해 대체를 수행합니다. 여기에서는 ksh(적어도 내장 변형), zsh, yash 또는 bash와 printf호환되는 구문을 사용하지만 GNU xargs또는 호환 가능하다고 가정합니다.

printf '%s\0' "${files[@]}" |
  xargs -r0 cat -- |
  sed '1!s/^{//; $!s/}$/,/' > result.json

입력 json 파일에 적절하게 구분된 줄이 있다고 가정합니다.

관련 정보