我必须处理多种格式的文本文件。这是一个示例(列 A 是制表符分隔的):

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

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

有帮助吗?

解决方案

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

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

给你:

 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 的书: 学习 Perl),应用广泛。

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

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

不要引用我的语法,但这就是总体思路。将手头的任务抽象出来,让你思考需要做什么,而不是如何做。Ruby 是另一种选择,它往往具有更清晰的语法,但任何一种语言都可以。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top