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是另一种选择,它倾向于使用更简洁的语法,但是任何一种语言都可以使用。