![尝试创建一个 while 循环将一个文件的内容输出到另一个文件](https://linux22.com/image/205635/%E5%B0%9D%E8%AF%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%20while%20%E5%BE%AA%E7%8E%AF%E5%B0%86%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9%E8%BE%93%E5%87%BA%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我正在尝试创建一个 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
为指示附加的空元素。