题
我必须处理多种格式的文本文件。这是一个示例(列 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 是另一种选择,它往往具有更清晰的语法,但任何一种语言都可以。
不隶属于 StackOverflow