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
)로 변경합니다. 이는 다음과 결합될 수 있습니다.한정.