jq
答えを模倣して、1つのコマンドで2つの文字列を処理しようとしています。この問題。
str1
ただし、2つの文字列(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の場合です。)
- 更新 -
もう一度確認するため。私の考えはもっと複雑です。デフォルトでは、2つの文字列(CSV)を解析してから、解析された2つの文字列の配列(おおよそ言うと)をマージする必要があります。ただし、入力を受け取ることはできません。
コメントで正しく指摘したように、他のツールは2つの生の文字列をよりよく処理できます。そしてプログラミングも簡単にできます。しかし、私はjqのきちんとしたワークフローを好みます。
とにかく、本当の質問は上記の投稿です。しかし、より具体的な例は次のとおりです。
2つの文字列がある場合
str1='(a),(c),(b)'
str2='(a),(b)'
jq
2つの配列/セットを解析して違いを見つけるためのコマンドを作成したいと思います。したがって、予想される出力は次のようになります。
(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
区切り文字をNULL文字(\0
)に変更します。これは以下と組み合わせることができます。限定。