あるファイルからコンテンツを取得し、別のファイルにいくつかのコンテンツを生成するようにwhileループを作成しようとしています。しかし、私はファイルのすべての行ではなく、ファイルの最後の行だけを生成することに気づきました。私がここで何を見逃しているのでしょうか?それとも私のエコー方法が間違っていますか?
"test"という名前の私のファイルには文字列のリストが含まれています。
unix_idx
web_pn_iis
wis_healthpartners
次のコマンドを使用してwhileループを作成しようとしています。
while read -r line;
do
echo " {
\"name\": \"$line\",
\"datatype\": \"event\",
\"searchableDays\": 180,
\"maxDataSizeMB\": 0,
\"totalEventCount\": \"0\",
\"totalRawSizeMB\": \"0\"
}," > myfile.json;
done < test;
ただし、コマンドが実行されると、myfile.jsonにはテストファイルから読み込まれた最後の行のみが含まれます。つまり、wis_healthpartners
{
"name": "wis_healthpartners",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
だからwhileループの実行中にエコーが書かれ、最後の行だけが残ったと思います。すべての行を含めるようにどのように調整しますか?私が望む出力は次のとおりです。
{
"name": "unix_idx",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "web_pn_iis",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "wis_healthpartners",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
答え1
Bashでは、>
オペレータはオペレータが追加中にファイル内の既存のデータを意図的に上書きします>>
。
始める前にファイルが空であることを確認する必要がある場合は、printf "" > myfile.json
ループが実行される前にファイルを消去してから>>
最後まで書き込みを続けることができます。
答え2
テストファイルのエントリが正しく引用されている場合のJSON文字列
$ cat test
"unix_idx"
"web_pn_iis"
"wis_healthpartners"
その後、jq
それを--slurpfile
配列にドラッグして繰り返して、次のようにテンプレートJSONファイルからオブジェクト配列を作成できます。
{
"name": "",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
}
前任者。
$ jq --slurpfile names test '
. | [foreach $names[] as $name (.; .name |= $name)]' template.json
[
{
"name": "unix_idx",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "web_pn_iis",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "wis_healthpartners",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
}
]
引用符で囲まれていない要素を使用する必要がある場合は、より多くの--rawfile
操作がありますが、同じ操作を実行できます。
jq --rawfile names test '
. | [foreach ($names | split("\n")[0:-1] | .[]) as $name (.; .name |= $name)]
' template.json
このスライスは、[0:-1]
ファイルの末尾の改行が追加の空の要素を表すと解釈されるためsplit("\n")
に必要です。test