あるファイルの内容を別のファイルに出力するには、whileループを作成します。

あるファイルの内容を別のファイルに出力するには、whileループを作成します。

あるファイルからコンテンツを取得し、別のファイルにいくつかのコンテンツを生成するように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

関連情報