다음과 같은 수천 개의 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
"컴팩트" 출력을 생성합니다.
파일이 너무 많으면 명령줄의 최대 허용 길이를 초과하므로 쉘이 명령을 실행할 수 없습니다.
이 경우 명령이 처리할 find
JSON 개체 스트림을 생성 할 수 있습니다.jq
find . -name '*.json' -type f -exec cat {} + | jq -c -s add >final
from을 사용하여 cat
입력 파일( find
이름이 현재 디렉터리 또는 현재 디렉터리로 끝나는 일반 파일)에서 JSON 개체 스트림을 생성합니다. .json
이 jq
명령은 이를 배열로 수집한 다음 이전과 같이 객체로 결합합니다. 최종 결과는 파일로 출력됩니다 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 파일에 적절하게 구분된 줄이 있다고 가정합니다.