cygwin中的命令行文件解析工具
时间:2020-03-05 18:58:38 来源:igfitidea点击:
我必须处理各种格式的文本文件。这是一个示例(A和B列由制表符分隔):
A B a Name1=Val1, Name2=Val2, Name3=Val3 b Name1=Val4, Name3=Val5 c Name1=Val6, Name2=Val7, Name3=Val8
文件可以有或者没有头,具有混合的定界方案,具有具有上述名称/值对的列等。
我经常需要以各种方式从此类文件中提取数据。例如,从以上数据中,我可能想要与存在Name2的值相关联。 IE。
A B a Val2 c Val7
以上面的示例为例,有哪些工具/技术可以执行诸如一行命令之类的操作,但可以扩展到其他情况?
解决方案
回答
我们可以使用所有基本的bash shell命令,例如grep,cut,sed和awk。我们还可以将Perl或者Ruby用于更复杂的事情。
回答
从我所看到的内容来看,我将从Awk开始进行此类工作,然后,如果我们需要更复杂的内容,那么我将继续使用Python。
回答
我会用sed:
# print section of file between two regular expressions (inclusive) sed -n '/Iowa/,/Montana/p' # case sensitive
回答
既然我们拥有Cygwin,我将选择Perl。这是最容易学习的方法(请查阅O'Reily的书:Learning Perl)并且适用范围广泛。
回答
我不太喜欢sed,但它适用于以下情况:
var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/ /p" < filename
给你:
A B a Val2 c Val7
回答
我会用Perl。编写一个小模块(或者多个模块)来处理不同的格式。然后,我们可以使用该库运行perl oneliners。举例说明
外观如下:
perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'
不要在语法上引用我,但这是一般的想法。提取手头的任务,使我们可以根据需要做的事情而不是如何做的事情进行思考。 Ruby是另一种选择,它倾向于使用更简洁的语法,但是任何一种语言都可以使用。