Ksh 如何重用标准输出而不将其保存到物理磁盘文件
我有一个for循环,如下所示:Ksh 如何重用标准输出而不将其保存到物理磁盘文件,ksh,Ksh,我有一个for循环,如下所示: for inf from $filelist; do for ((i=0; i<imax; ++i)); do temp=`<command_1> $inf | <command_2>` eval set -A array -- $temp ... done ... done 性能有了一些改进,但没有我想要的那么多,可能是因为磁盘I/O也是性能瓶颈 只是想知道是否有办法保存命令\u 1的标准输出
for inf from $filelist; do
for ((i=0; i<imax; ++i)); do
temp=`<command_1> $inf | <command_2>`
eval set -A array -- $temp
...
done
...
done
性能有了一些改进,但没有我想要的那么多,可能是因为磁盘I/O也是性能瓶颈
只是想知道是否有办法保存命令\u 1
的标准输出,这样我就可以在不将其保存到物理磁盘文件的情况下重用它?不要在嵌套循环中使用管道
基于新的评论和对原始问题的另一种看法,我强烈建议不要在嵌套循环中使用管道处理大量数据。壳牌管道的效率很低,并且会产生大量的流程开销
看看最初的问题,这涉及到研究command_1
和command_2
的贡献,看看是否可以用另一种方法解决这个问题
也就是说:以下是原始答案:
在shell中,有两种存储数据的方法:在shell变量中或在文件中。您可以尝试将该文件存储在基于内存的文件系统中,如linux上的/dev/shm或Solaris中的tmpfs
您还可以分析command_1
和command_2
进行优化。command\u 1
的输出中是否有command\u 2
不需要的内容?试着在两者之间加一个过滤器
例如:
command_1 | awk '{ print $2 }' | command_2
(假设command_2
只需要command_1
的第2列输出。)这实际上取决于command_2产生的数据量,以及它需要command_1提供的数据量。好主意,亨克!是的,在每个循环迭代中,只需要第i列。但是如何将这个awk
语句嵌入for循环呢?我尝试了command_1 | awk'{print$$I}'| command_2
(在for循环中),但不起作用。这里有什么建议吗?试试。|awk-vi=$i'{print$i}'|…
或。|削减-f$i |…
。但是,看起来您可以使用基于纯awk/perl/python/…的解决方案,而不需要所有的处理开销。
command_1 | awk '{ print $2 }' | command_2