Bash

嘗試創建一個while循環以將一個文件的內容輸出到另一個文件

  • May 10, 2022

我正在嘗試創建一個 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文件的尾隨換行符解釋為指示額外的空元素。

引用自:https://unix.stackexchange.com/questions/701937