尝试创建一个 while 循环将一个文件的内容输出到另一个文件

尝试创建一个 while 循环将一个文件的内容输出到另一个文件

我正在尝试创建一个 while 循环,以便它从一个文件中获取内容并在另一个文件上创建一些内容。但我注意到它只创建文件的最后一行而不是文件中的所有行。我在这里缺少什么?或者我的 echo 方法是错误的?

我的名为“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"

},

答案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为指示附加的空元素。

相关内容