如何将命令行参数传递给kdb函数

时间:2019-01-22 18:41:34

标签: sh kdb

我写了一个shell脚本来从一个大表中收集有关字母的每个字符的数据。由于该函数占用大量内存,因此我想对字母的字符进行分区,以便使用不同的端口号同时调用每个字符。但是我似乎无法成功地将所需的命令行参数传递给我的函数。在单个端口和一个小表上进行测试,我尝试了以下操作...

在服务器上:我设置了虚拟表并定义了一个函数...

ts:([]sym:1000?`A`Ab`B`Bc`C`Ca`X`Xz`Y`Yx`Z`Zy;price:1000?100.0;num:til 1000)
collect:{[x;y]select from x where sym like y}

在客户端上:打开连接句柄,使用.z.X名称空间返回未经过滤的原始命令行参数的字符串,对其进行索引并存储为变量,然后尝试将该变量传递到我的服务器端功能。我试过存储为字符和符号。它将运行无错误,但调用时均不会返回任何数据。我将此文件另存为collector.q

/ start connection handles to remote server
h:hopen `::5000
/ index into command line arguments to get partition letter. Store as character and symbol
part:.z.X[6]
symPart:`$part
/ call server side functions
fetched:h (`collect; `ts; "symPart*")
/ close connection handle
hclose h

我的shell脚本如下所示...

#!/bin/sh
port=$1
partition=$2

for x in {A..Z}
do
  echo running partition $x on port $port
  $QHOME/l64/q collector.q -p $port -partition $x > ./stdout$port.log 2>&1 &
  port=$(($port + 1))
done

运行shell脚本后,在客户端上调用fetched函数时,返回的是一个空表...

q)fetched
symbol price ID
---------------
q)

1 个答案:

答案 0 :(得分:2)

我认为第一个问题是您没有从命令行获得正确的零件值。 .z.X返回命令行作为令牌列表,而.z.x返回命令行,但没有q命令和文件名。

q test.q -p 5000 -partition a

q).z.X
"/opt/kdb/3.5/l32/q"
"test.q"
"-p"
"5000"
"-partition"
,"a"
q).z.X[6]
""

使用.Q.opt函数将命令行参数转换成更可靠的字典。

q)params:.Q.opt .z.X
q)params
p        | "5000"
partition| ,"a"
q)`$first params`partition
`a

第二个问题是"symPart*"不会计算变量symPart,因为它位于引号内。 kdb +看到的只是一个字符串。 bash脚本的每个循环都将在句柄上发送相同的命令(`collect; `ts; "symPart*"),并针对"symPart"分区(我猜不存在)进行收集检查。

要将其作为变量传递,可以将其更改为symPart,"*",但是在这种情况下,symPart必须是字符串,而不是符号,以便删除强制转换。

您可以如下修改脚本:

/ start connection handles to remote server
h:hopen `::5000
/ convert command line arguments into dictionary and index to get partition letter
part:first .Q.opt[.z.X]`partition;
/ call server side functions
fetched:h (`collect; `ts; symPart,"*")
/ close connection handle
hclose h

或者要在单个q脚本中完成所有操作,您可以执行以下操作:

/ start connection handles to remote server
h:hopen `::5000

/ call server side functions
fetched:.Q.a!h each (`collect; `ts),/: enlist each .Q.a,\:"*"
/ close connection handle
hclose h

.Q.a将所有小写字母都保存在字符串中。

q).Q.a
"abcdefghijklmnopqrstuvwxyz"

我们可以使用左每个\:,(联接)来创建所有通配符,以将每个通配符联接到"*",然后创建多个命令以使用每个通配符来传递句柄右/:,将不变的左手加入所有不同的通配符。

q).Q.a,\:"*"
"a*"
"b*"
"c*"
"d*"
..

q)(`collect; `ts),/: enlist each .Q.a,\:"*"
`collect `ts "a*"
`collect `ts "b*"
`collect `ts "c*"
..

请注意,fetched的输出将是一个字典,以键作为分区,每个分区的提取结果作为对应的值。

相关问题