0

我必须处理各种格式的文本文件。这是一个示例(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

有哪些工具/技术可以执行诸如单行命令之类的操作,以上述为例,但可以扩展到其他情况?

4

6 回答 6

1

您可以使用所有基本的 bash shell 命令,例如 grep、cut、sed 和 awk。您还可以将 Perl 或 Ruby 用于更复杂的事情。

于 2008-09-17T11:49:36.967 回答
1

我不太喜欢 sed,但它适用于这样的事情:

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

给你:

 A B
 a Val2
 c Val7
于 2008-09-17T12:04:23.267 回答
0

从我所看到的情况来看,我会从 Awk 开始做这类事情,然后如果你需要更复杂的东西,我会继续使用 Python。

于 2008-09-17T11:51:42.330 回答
0

我会使用 sed:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive
于 2008-09-17T11:53:04.790 回答
0

既然你有 cygwin,我会选择 Perl。它是最容易学习的(查看 O'Reily 的书:Learning Perl)并且应用广泛。

于 2008-09-17T12:00:40.810 回答
0

我会使用 Perl。编写一个小模块(或多个模块)来处理不同的格式。然后,您可以使用该库运行 perl oneliners。示例如下:

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

不要引用我的语法,但这是一般的想法。抽象手头的任务,让你思考你需要做什么,而不是你需要如何去做。Ruby 将是另一种选择,它往往具有更简洁的语法,但任何一种语言都可以工作。

于 2008-09-17T12:27:05.240 回答