我有一个程序可以执行一些繁重的处理(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>
答案 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上的程序。
然后该程序可以以任何方式对该数据进行操作。
grep
,sed
和awk
等计划以面向行的方式对该数据进行操作。
其他程序可以根据需要做其他事情。
答案 2 :(得分:0)
./ myProgram模型测试|现在是什么
如果我理解你想要[ I care data inside brackets ]
(只是方括号之间的数据),那么一种正确的方法是将输出传递给sed
,然后使用backreference
来替换文本行与括号内的内容一致。因此now what
是sed -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(一个易于使用的库)或更严肃的内容(例如PostGreSQL或MongoDb