加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Rebol 3:逐行有效地读取STDIN(使awk像工具一样)

发布时间:2020-12-14 01:12:51 所属栏目:Linux 来源:网络整理
导读:我试图制作一个类似awk的工具,它使用Rebol 3来处理带有bash管道和工具的更大的文本文件.我在Rebol 3中逐行阅读STDIN时遇到问题? 例如,这个shell命令产生3行: $(echo "first line" ; echo "second line" ; echo "third line" )first linesecond linethird l
我试图制作一个类似awk的工具,它使用Rebol 3来处理带有bash管道和工具的更大的文本文件.我在Rebol 3中逐行阅读STDIN时遇到问题?

例如,这个shell命令产生3行:

$(echo "first line" ; echo "second line" ; echo "third line" )
first line
second line
third line

但是Rebol的输入字同时读取所有3行.如果您以交互方式使用输入,我会期望它停止在换行符处停止.

r3 --do 'while [ x: input ] [ if empty? x [ break ] print x print   "***" ]' 
abcdef
abcdef
***
blabla
blabla
***

但是当我一起运行它时,它会立即读取整个输入.我可以一次性阅读并分成几行,但我希望它以“流式”的方式工作,因为我通常会在很多1000行中捕捉它.

$(echo "first line" ; echo "second line" ; echo "third line" )  
  | r3 --do 'while [ x: input ] [ if empty? x [ break ] print x print "***" ]' 
first linesecond linethird line
***

我还查看了输入源以制作类似的功能.我可以在while循环中读取每个字符的字符并检查换行符,但这看起来效率不高.

解决方法

我想通了,它似乎在大的10000行文件上运行良好.尽管如此,它可以更优雅地编写和改进.

函数r3awk接受STDIN和它每行执行的代码块,绑定行变量:

r3awk: func [ code /local a lines line partial ] [ 
    partial: copy ""
    lines: read/lines/string system/ports/input
    while [ not empty? lines ] [
        lines/1: rejoin [ partial lines/1 ]
        partial: pull lines
        foreach line lines [
            do bind code 'line
        ] 
        if error? try [ lines: read/lines/string system/ports/input ] [ lines: copy [] ]
    ]
    line: partial
    do bind code 'line
]

它的工作原理如下. read / lines从流中读取多个字符并返回一个行块.每次调用它都会读取下一批这样的字符,所以它都包含在while循环中.代码处理(执行代码块)作为while循环(不在结尾).

该批字符不会在换行符上结束,因此每次最后一行都是部分的.下一批中的第一行也是如此,因此它将它们连接在一起.最后,它必须处理最后一行(这次是非部分的).尝试是因为某些行导致utf编码错误.

它可以在命令行中使用:

(echo "first line" ; echo "second line" ; echo "third line" ) | 
 r3 --import utils.r --do 'r3awk [ parse line [ copy x to space (print x) ] ]'
first
second
third

需要改进的地方:使功能更好,重复删除一些代码.检查如果read / lines确实在换行符上结束会发生什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读