使用grep / awk / UNIX以列格式解析库存和价格的日志,而不知道字段的位置

时间:2015-07-02 12:22:59

标签: bash unix awk

我有一个包含交易信息的修复日志,例如:

  ==>  8=FIX4.2|39=1|55=IBM|6=138  
  ==>  8=FIX4.2|39=1|55=APPL|6=130  
  ==>  8=FIX4.2|39=1|55=GE|6=11  

我试图grep输出,以便我可以得到这样的东西:

 IBM    138  
 APPL   130   
 GE     11  

其中第一列是IBM,第二列是138。

我正在尝试这个:

grep 39=1 some.log | tr "|" "\n" | egrep '(^55=|^6=)' 

但这只会在不同的行上获得股票/价格,如下所示:

IBM
AAPL
GE
138
130
11

是否有bash / unix one liner会得到这个?

与此帖相关

Parsing fix logs for stock and price in column formats using grep /awk/UNIX

这是通过这个答案解决的:

awk -F '[|=]' '{printf "%-6s %s\n", $8, $10}' file

说我不知道​​8,10是那些标签的位置,最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

这样做可能会有些过分,因为它适用于任何一个领域的所有可能位置:

Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim sDb As String
Dim sSQL As String
Dim qdf As QueryDef

sDb = ActiveWorkbook.Path & "\DataBase.accdb"

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(sDb)

sSQL = "Parameters" _
& " SomeText Text; " _                       <<== Here << ==
& "INSERT INTO IT_Ticker (SomeText)" _
& " Values ([ SomeText ])"

Set qdf = db.CreateQueryDef("", sSQL)

qdf.Parameters!SomeText = Worksheets("SomeSheet").Range("A1")

qdf.Execute dbFailOnError
Debug.Print qdf.RecordsAffected

qdf.Close
db.Close
ws.Close

Set qdf = Nothing
Set db = Nothing
Set ws = Nothing

]它使用GNU awk为第3个arg匹配()。

答案 1 :(得分:2)

这不是你所知道的,但是你考虑过perl吗?

鉴于你所说的话,看起来你已经命名了字段,所以这样的东西会起作用:

#!/usr/bin/env perl
use strict;
use warnings;

my @cols = qw ( 55 6 );

while (<>) {
    my %data = m/(\d+)=([\w.]+)/g;
    print "@data{@cols}\n";
}

给出输入数据时,会打印:

IBM 138
APPL 130
GE 11

它正在做的是匹配&#39;对&#39;使用该正则表达式的键和值,并将每一行转换为如下所示的哈希表:

$VAR1 = {
          '55' => 'APPL',
          '8' => 'FIX4',
          '39' => '1',
          '6' => '130'
        };

我们告诉它通过切片@data{@cols}提取字段说明只提取这两个特定列的值。

你可以这样做:

print $data{55};
print $data{6};