하나의 jq 명령으로 두 문자열을 처리하는 방법은 무엇입니까?

하나의 jq 명령으로 두 문자열을 처리하는 방법은 무엇입니까?

jq답변을 모방하여 하나의 명령으로 두 개의 문자열을 처리 하려고 합니다.이 문제.

str1하지만 두 문자열(bash 변수에 저장됨 ) 을 연결하는 것과 같은 간단한 작업도 완료할 수 없습니다 str2. SO 답변을 조정하여 다음을 시도했습니다.

jq -s -R '.[0] + .[1]' <(echo "$str1") <(echo "$str2")

하지만 오류가 발생합니다.

jq: 오류(/dev/fd/62:1): 숫자로 문자열을 색인화할 수 없습니다.

나는 jq를 처음 사용합니다.

누군가 위의 jq 사용법을 수정하는 방법을 설명해 주시겠습니까?

(jq 1.6, Ubuntu 18.04 LTS의 경우입니다.)

- 갱신 -

다시 한번 확인하기 위해. 내 생각은 더 복잡하다. 기본적으로 두 문자열(CSV)을 구문 분석한 다음 구문 분석된 두 문자열 배열(대략적으로 말하면)을 병합해야 합니다. 하지만 입력을 받을 수는 없습니다.

주석에서 올바르게 지적했듯이 다른 도구는 두 개의 원시 문자열을 더 잘 처리할 수 있습니다. 그리고 프로그래밍도 쉽게 할 수 있어요. 하지만 저는 jq의 깔끔한 작업 흐름을 선호합니다.

어쨌든, 진짜 질문은 위에 게시된 내용입니다. 하지만 좀 더 구체적인 예를 들면 다음과 같습니다.

두 개의 문자열이 있는 경우

str1='(a),(c),(b)'
str2='(a),(b)'

jq두 개의 배열/세트를 구문 분석하고 차이점을 찾는 명령을 작성하고 싶습니다 . 따라서 예상되는 출력은 다음과 같습니다.

(c)

(문서 및 연결된 SO 질문에 표시된 대로) 모든 정렬, 차이점 설정 등을 수행하는 것이 가능하다는 것을 알고 있지만 jq두 입력을 jq로 가져오는 방법을 잘 모르겠습니다.

답변1

다음 명령을 실행해 볼 수 있습니다

sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))

실시된 테스트

$ str1='(a),(c),(b),(d)'
$ str2='(a),(b)'
$ sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))
(c),(d)

쉘 매개변수 대체

echo "${str1//,/$'\n'}

쉼표를 줄 바꿈으로 바꾸십시오.

명령 comm이 값을 정렬해야 하므로

echo "${str1//,/$'\n'}" | sort

마지막 줄에 개행 문자를 바꾸지 마세요

sed -z 's/\n/,/g;s/,$/\n/'

알아채다. -z구분 기호를 널 문자( \0)로 변경합니다. 이는 다음과 결합될 수 있습니다.한정.

관련 정보