단일 "jq" 명령이 다른 파일에 기록됩니다.

단일 "jq" 명령이 다른 파일에 기록됩니다.

JSON 로그 파일이 있습니다 test.log.

{"type":"1","fname":"AAA","lname":"bbb" }    
{"type":"2","state":"gujarat" }     
{"type":"3","city":"ahmedabad" }    
{"type":"3","city":"rajkot" }   
{"type":"1","fname":"ccc","lname":"ddd" }  

다음 명령을 실행합니다.

cat test.log | jq -c "select(.type==\"1\")|{fname:.fname}" > type_1.txt     
cat test.log | jq -c "select(.type==\"3\")|{city:.city}" > type_3.txt  

단일 명령으로 jq여러 출력 파일을 생성할 수 있나요?

파일에 대해 jq명령을 한 번만 실행 test.log하고 각 프로젝트 유형에 대해 하나의 출력 파일을 생성하고 싶습니다.

답변1

~에 따르면매뉴얼의 IO 부분버전 1.5부터 jq는 표준 출력에만 쓸 수 있고 디버그 메시지를 stderr.

jq를 여러 번 실행 하고 싶지 않다면 test.log(예: 대용량 파일이기 때문에) 다음과 같이 할 수 있습니다.

jq -c '(select(.type=="1") | {fname:.fname}), (select(.type=="3") | {city:.city})' test.log > temp
# The file 'temp' contains one entry per line.
grep '^{"fname"' temp > type_1.txt
grep '^{"city"' temp > type_3.txt   
rm temp

답변2

를 사용하는 대신 jq다른 JSON 인식 프로세서인 Miller( mlr)를 사용하세요.

mlr --json put -q '
    $type == 1 { emit >"type_1.txt", { "fname": $fname } }
    $type == 3 { emit >"type_3.txt", { "city":  $city  } }' file

is 인 경우 fname키와 파일에 해당하는 값이 포함된 JSON 개체를 인쇄하고 해당 키에 대한 항목도 처리합니다.type_1.txttype1type 3city

파일 type_1.txttype_3.txt존재하는 경우 이 명령이 새 데이터를 쓰기 전에 잘립니다(비어집니다).

예제를 실행하세요:

$ mlr --json put -q '$type == 1 { emit >"type_1.txt", { "fname": $fname } }; $type == 3 { emit >"type_3.txt", { "city":  $city  } }' file
$ cat type_1.txt
{ "fname": "AAA" }
{ "fname": "ccc" }
$ cat type_3.txt
{ "city": "ahmedabad" }
{ "city": "rajkot" }

답변3

jqstdout(또는 stderr)만 기록되므로 스트림을 다른 로그 파일로 분할하려면 다른 프로그램이 필요합니다.
먼저 js@nwk의 명령으로 로그 파일 필드 강화를 사용합니다.

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log

이 출력을 파이프로 연결하면 awk파일 이름을 얻을 수 있습니다.

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log |
       awk -F"\"" 'BEGIN {FPAT="[^{}:\"]+" } 
            $1=="logfile" {lf="type_"$2".txt"; next}
            {print >> lf}'

답변4

파티에 조금 늦었어요. 이 문제를 완전히 되돌릴 수 있습니다. 스크립트로 실행될 때 다른 파일에 쓰는 방법을 묻는 대신 다른 파일에 쓰는 출력을 jq생성할 수 있습니다 .jq

예는 다음과 같습니다.

jq -r \
  $' recurse( .children[] ) | 
  select( (.type="comment") and (.text != null) ) |
  "echo \'" + .text + "\' >> " + .author + ".txt" ' < file.json

실행하면 다음과 같은 출력이 생성됩니다.

echo '<p>Nice! Definitely let me know.</p>' >> user_1.txt
echo '<p>I agree.</p>' >> user_2.txt

그런 다음 이 출력을 스크립트로 실행하여 별도의 파일을 생성할 수 있습니다. jq현재 셸 이외의 종속성도 없고 파이프도 없으며 추가 도구도 필요하지 않습니다. $'접두사와 '접미사는 명령문 \'내에서 이스케이프될 수 있습니다 echo.

관련 정보