我正在尝试编写一个非常简单的 Nushell 脚本。我想跳过前 46 行并将其余的通过管道传递给外部命令。在 Bash 中:
zcat filename.sql.gz |
tail -n +46 |
mysql dbname
由于 Nushellopen
似乎不支持压缩格式,我提取了.gz
然后在 Nushell 中尝试:
> open --raw filename.sql | lines | skip 46 | describe
list<string>
...所以我有一个列表,因此我应该能够将其转换为一个字符串,但是...
> open --raw filename.sql | lines | skip 46 | to text | mysql dbname
看起来好像试图将整个文件加载到内存中,但它太大了。有没有办法避免这种情况?
重要提示:正如@Prem 在评论中正确提到的那样,我下面的当前答案仅适用于狭窄的用例,并且可能会导致大多数基于 SQL 的工作负载出现问题,例如问题中的问题。它似乎对 OP 有效(基于当前对答案的接受)是一个快乐的巧合。
请参阅此答案的底部,了解错误的原因、可能导致问题的情况以及我们如何(最终)使其工作。
简短的回答(解决您的几个问题),请尝试:
解释:
正如您在 Github 问题中提到的 fdncred ,问题是
to text
.那是试图将整个
list<string>
转换为文本。当然,在读取整个文件之前不会发生这种情况。您似乎真正希望它在读取时简单地处理每一行。
您可以在不将其提供给 MySQL 的情况下看到这一点,例如:
^^^ 快速而肮脏地使用 Bash 来打印它在 stdin (the
cat
) + 换行符 (theecho
) 上接收到的内容。请注意,那里有一些速记,主要是关于隐式输出和
each
块处理。一个更传统的、显式输出、显式每个变量的选项:此外,正如您在“简短答案”中可能注意到的那样,使用此表单您可以返回使用
zcat
来处理压缩文件。“哎呀”部分
如前文所述,这并不适用于所有(也许是大多数)情况。
这将为原始文件中的每一行
each
生成一个新进程。这通常不起作用,因为 SQL 语句可以跨越多行。尝试将多行语句的单行传递到单个进程将失败。mysql
mysql
我可以想出六种不同的方法来完成这项工作,但到目前为止,所有这些方法都需要对 Nushell 进行更改。
恕我直言,最好的方案是
to text
按照您最初的预期进行流式传输,这是最近的 Nushell 功能请求(#6178)。