如何将BigQuery COUNT(*)查询结果转为整数存入Shell变量?
问题
我尝试在GCP BigQuery中执行SELECT语句,统计特定行中状态为"failed"的条目数量,使用bq query命令:
bq query \ --use_legacy_sql=false \ ' SELECT COUNT(*) FROM `myproject.mydataset.mytable` CROSS JOIN UNNEST(controls) AS c WHERE profile LIKE "%/myprofile/%" AND vm = "myvm" AND c.status = "failed" '
我想将结果赋值给Shell脚本中的变量,执行了如下命令:
MYVAR=$(bq query --use_legacy_sql=false 'SELECT COUNT(*) FROM `myproject.mydataset.mytable` CROSS JOIN UNNEST(controls) AS c WHERE profile LIKE "%/myprofile/%" AND vm = "myvm" AND c.status = "failed"')
但执行echo $MYVAR时得到的是表格形式:
+-----+ | f0_ | +-----+ | 6 | +-----+
我希望结果是纯整数,比如:
6
请问如何让SQL SELECT仅返回整数,或如何过滤结果表格只获取数值字段?
解决方案
有两种常用方法可以获取纯整数结果:
方法一:通过bq query参数直接输出纯值
使用--format=value参数,让BigQuery直接返回查询结果的纯数值,不包含表格格式:
MYVAR=$(bq query --use_legacy_sql=false --format=value 'SELECT COUNT(*) FROM `myproject.mydataset.mytable` CROSS JOIN UNNEST(controls) AS c WHERE profile LIKE "%/myprofile/%" AND vm = "myvm" AND c.status = "failed"')
执行echo $MYVAR即可得到纯整数结果。
方法二:用Shell工具过滤表格输出
如果不想修改bq命令参数,可以用awk或grep等工具提取数值:
用awk提取指定行的数值
MYVAR=$(bq query --use_legacy_sql=false 'SELECT COUNT(*) FROM `myproject.mydataset.mytable` CROSS JOIN UNNEST(controls) AS c WHERE profile LIKE "%/myprofile/%" AND vm = "myvm" AND c.status = "failed"' | awk 'NR==4 {print $1}')
这里NR==4对应表格中的数值行(第4行),提取该行的第一个字段就是目标整数。
用grep匹配提取数字
MYVAR=$(bq query --use_legacy_sql=false 'SELECT COUNT(*) FROM `myproject.mydataset.mytable` CROSS JOIN UNNEST(controls) AS c WHERE profile LIKE "%/myprofile/%" AND vm = "myvm" AND c.status = "failed"' | grep -Eo '[0-9]+')
grep -Eo '[0-9]+'会输出所有匹配的数字,由于查询结果只有一个数值,直接得到目标整数。
内容的提问来源于stack exchange,提问作者Alexandre Soares
相关产品推荐
相关产品推荐

