解析程序在运行中逐行输出

时间:2015-01-01 03:59:04

标签: linux shell parsing stdout

我有一个程序可以执行一些繁重的处理(ML算法)并将数据(读取GB的纯文本)写入标准输出。在某些特定情况下,我只需要输出的一小部分,但是现在我正在保存一个(巨大的)文本文件,然后解析那里的行以获取我的数据。

虽然完全有效,但我的方法非常有效。有没有办法避免生成这样大的文件(因为大多数数据都会被删除),并且可以逐行进行解析。

执行:

./myProgram model test > myOutput

myOutput内容(数百万行):

0, blah blah blah thousand of more blahs -> [ I care data inside brackets ]
0, blah blah blah thousand of more blahs -> [ I care data inside brackets ]
....

我认为最好的选择是使用unix管道链接结果,但我不知道如何逐行发送数据,让我们说一个python或java应用来解析它。

./myProgram model test | <now what>

4 个答案:

答案 0 :(得分:3)

要在脚本中读取和写入数据,以便过滤从标准输入/输出读取和写入的数据。

./myProgram model test | ./filter.py > myOutput

filter.py:

import sys

for line in sys.stdin:
    if some_condition:
        sys.stdout.write(line)

如果条件只是在数据中有一些模式而不需要脚本,则只需使用grep来过滤这些行:

 ./myProgram model test | grep 'interesting_pattern' > myOutput

答案 1 :(得分:1)

那条管道确实如此。它将数据(可能是缓冲的)发送到管道的RHS上的程序。

然后该程序可以以任何方式对该数据进行操作。

grepsedawk等计划以面向行的方式对该数据进行操作。

其他程序可以根据需要做其他事情。

答案 2 :(得分:0)

  

./ myProgram模型测试|现在是什么

如果我理解你想要[ I care data inside brackets ](只是方括号之间的数据),那么一种正确的方法是将输出传递给sed,然后使用backreference来替换文本行与括号内的内容一致。因此now whatsed -e 's/^.*[[]\(.*\)[]].*$/\1/'。或者放在一起:

./myProgram model test | sed -e 's/^.*[[]\(.*\)[]].*$/\1/' > myOutput

如果您的程序提供所提供的输出,则示例为:

$ echo "0, blah blah blah thousand of more blahs -> [ I care data inside brackets ]" | 
sed -e 's/^.*[[]\(.*\)[]].*$/\1/'
 I care data inside brackets

如果你仔细观察正则表达式的简要说明是相对容易的:

 's/^.*[[]\(.*\)[]].*$/\1/'

s/this/that/形式的简单替换表达式。查看您拥有的第一个(或this)部分:

^.*   # from the beginning of the line, match all characters
[[]   # until you find the first open bracket [
\(    # begin saving the pattern that follows
.*    # all characters in this case
\)    # stop collecting the pattern
[]]   # before you encounter the close bracket ]
.*$   # and then all remaining characters in the line.

接下来,that表达式的第二个(或s/this/that/)部分为backreference,表示:

\1    # substitute the (1st) pattern you collected. All between \(...\) for the line.

当放在一起时简单地说用支架之间的东西替换线。(当然,如果我不理解你需要什么,那么它是一个很长的解释管子。)

答案 3 :(得分:-1)

如果确实输出是面向行的,并且您想要提取或处理其中的一些,请将输出传递给某个awk命令,即

 ./myProgram model test | awk ...

当然,用...的适当参数替换awk。详细了解GNU awk(a.k.a。gawk)是否专为此类任务而设计:

  

如果您像许多计算机用户一样,您经常希望在出现某些模式的地方对各种文本文件进行更改,或者在丢弃其余部分时从某些行的部分提取数据。编写用C或Pascal等语言执行此操作的程序是一项耗时的不便,可能需要多行代码。使用awk很容易,尤其是GNU实现:gawk。

或者,您可以修改原始./myProgram以允许它使用sqlite(一个易于使用的库)或更严肃的内容(例如PostGreSQLMongoDb

填写一些数据库