仅在R标记中渲染块输出的最后X行

仅在R标记中渲染块输出的最后X行,r,shell,r-markdown,R,Shell,R Markdown,我从R Markdown这样调用一个shell程序 ```{sh} SomeShellProgram -options ``` 并将文件呈现为HTML。程序的计算确实需要一些时间,因此作者包括了一个自我更新进度“条”,它看起来像这样: 45Mb 12.4%935个OTU,3485个嵌合体(6.7%) 但是,特别是当进度缓慢时,它将每隔0.1%左右更新这一行。并且每一行都在HTML中单独呈现,HTML最多可以显示1000行进度条 我不想完全抑制输出,例如在块选项中使用echo=FALSE。我正在

我从R Markdown这样调用一个shell程序

```{sh}
SomeShellProgram -options
```
并将文件呈现为HTML。程序的计算确实需要一些时间,因此作者包括了一个自我更新进度“条”,它看起来像这样:

45Mb 12.4%935个OTU,3485个嵌合体(6.7%)

但是,特别是当进度缓慢时,它将每隔0.1%左右更新这一行。并且每一行都在HTML中单独呈现,HTML最多可以显示1000行进度条

我不想完全抑制输出,例如在块选项中使用
echo=FALSE
。我正在制作一份报告,打印的信息很重要

我正在寻找一种只捕获最后X行并渲染这些行的黑客,或者使用
grep
或类似的方法,只捕获
100%
左右的行

我试着用
>output.txt
重定向输出,但是没有将进度打印到文件中(尽管其他信息是无效的)

如果不给出完整的例子,我想不出一种方法来提供一个可复制的例子,对此我深表歉意

对于那些感兴趣的人:我正在尝试生成一份关于16S Illumina测序数据分析的报告,我正在使用
Usearch
,而最让我头疼的命令是
Usearch-cluster_otus
命令

更新

渲染最后X行时还有一个问题:输出中的进度条由
^M
(回车符)分隔,而不是由换行符分隔,因此
less
仅将其识别为一行。因此,我的最终解决方案包括

  • 使用
    2>
    将进度条的输出重定向到文件中
  • 使用
    sed将
    ^M
    字符替换为换行符
  • 更少的
  • 我在MacOSX上执行此操作的(伪)代码如下(其中X=行数)

    在R减价中

    ```{sh, results="hide"}
    FunctionWithProgressBar -option 2> tempfile.tmp
    ```
    ```{sh, echo=FALSE}
    sed -ibak $'s/\x0D/\\\n/g' tempfile.tmp
    tail -nX tempfile.tmp
    ```
    

    请注意,匹配退格是一件让人头疼的事(特别是在osx上)以及平台之间的变化

    进度条可能在strr流中,因此您可以使用“2>”而不是“>”来捕获它,以便可以分别捕获strr和stdout,例如:

    usearch blablabla 2> only_err > only_stdout
    
    或者,如果希望将所有输出都放在一起,则必须将stderr重定向到stdout,并进行追加,如下所示:

    usearch blablabla >> total_output 2>&1
    
    至于R-markdown部分,我真的帮不上忙,从未使用过,对不起

    问候,


    Moritz

    进度条可能在sterr流中,因此您可以使用“2>”而不是“>”来捕获它,以便可以分别捕获stderr和stdout,例如:

    usearch blablabla 2> only_err > only_stdout
    
    或者,如果希望将所有输出都放在一起,则必须将stderr重定向到stdout,并进行追加,如下所示:

    usearch blablabla >> total_output 2>&1
    
    至于R-markdown部分,我真的帮不上忙,从未使用过,对不起

    问候,


    莫里茨

    谢谢莫里茨,它工作得很好。我只需要将
    2>
    重定向到一个文件,然后我就可以用
    tail file
    只打印最后一行了。Markdown将打印打印到控制台上的所有内容,因为控制台上没有打印任何内容,如果我重定向steer stream,它将完美工作!谢谢莫里茨,它工作得很好。我只需要将
    2>
    重定向到一个文件,然后我就可以用
    tail file
    只打印最后一行了。Markdown将打印打印到控制台上的所有内容,因为控制台上没有打印任何内容,如果我重定向steer stream,它将完美工作!