我被要求从一个非常丑陋的CSV文件中提取特定的值。
该CSV文件格式如下:
command1=value1, command2=value2, etc etc.
到目前为止还没有问题,我一直在使用grep命令来查找所需的命令,然后通过cut -f 2 -d '=' 进行管道传输,以返回只有值。
我遇到的问题是其中一个字段是文本,可以具有由逗号分隔的多个值。要增加另一个曲线球,如果(仅当)其中一个值中有空格时,该字段将用双引号括起来,因此我要提取的值可能是:
command=value,..
command=value1,value2,..
command="value 1",..
command="value 1, value 2",..
(其中 ... 是日志文件中的其他值或行尾)
我原以为只需使用grep -oP '(?<=command1=).*(?= command2)'提取两个字段名称之间的数据,然后通过rev | cut -c 2- | rev 进行管道处理就可以解决问题了。
但我现在发现字段出现的顺序并不一致,因此文件可能会是:
command1=value1, command3=value3, command2=value2
当命令可能或可能没有用双引号括起来时,如何获取command2的值,它也可能有逗号。我很难想象它可能是如何可能的,因为grep如何知道什么是值分解和下一个字段。
非常感谢您的任何帮助。