Bash
嘗試創建一個while循環以將一個文件的內容輸出到另一個文件
我正在嘗試創建一個 while 循環,以便它從一個文件中獲取內容並在另一個文件上創建一些內容。但我注意到的是它只創建文件的最後一行,而不是文件中的所有行。我在這裡想念什麼?還是我的迴聲方法錯誤?
我的名為“test”的文件包含 ex 的字元串列表。
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"
},
在 Bash 中,
>
運算符有意覆蓋文件中的任何現有數據,而>>
運算符將追加。如果您需要在開始之前確保文件為空,您可以
printf "" > myfile.json
在循環執行之前使用 清除它,然後使用>>
繼續寫入到最後。
如果測試文件中的條目是正確引用的 JSON 字元串
$ cat test "unix_idx" "web_pn_iis" "wis_healthpartners"
然後您可以使用
jq
’s--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
文件的尾隨換行符解釋為指示額外的空元素。