我有一个包含交易信息的修复日志,例如:
==> 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是那些标签的位置,最好的方法是什么?
答案 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};