内置函数主要分为三大类:
-
输入输出:stdout, stderr,read_tsv
-
信息获取类:defined, glob, basename, select_first
-
变量操作:prefix, sub
WDL函数的目的主要在于粘合task,不要用于一般的数据处理操作(放在task中处理)
输入输出函数
对内容汇总,其基本功能也可通过command多行命令实现,但不利于协作开发,尤其是代码维护,可以强制输出文件的格式类型。
标准输出/报错获取
stdout()函数用于捕获command中命令生成的标准输出。
task demo_echo{
String a = "Hello world"
command{echo ${a}}
output{File demo = stdout()}
}
stderr()函数用于捕获command中命令生成的标准报错。
task demo_echo{
command{sm_cmd ...}
output{File demo = stderr()}
}
stderr比stdout更常用,更多用于捕获warning信息
文件输入输出
文件输入输出函数的主要作用是讲WDL中的数据传递成为文件,并将文件内容转化为WDL变量。通常与stdout联合使用。
-
文件读入:read_tsv, read_json, read_lines... #文件转化为变量
-
文件输出:write_tsv, write_lines... #变量转化为文件
基本格式:TSV
-
tab分隔,类似R中的data.frame。
-
tsv文件在wdl解析时,没有表头行(header),因此在scatter时需要进行特别处理。
基本格式:JSON
-
结构化存储,key-value
-
对于结构相对复杂的数据类型,如Map、Object,非常适合json输入输出
输入函数以read_json为例:将一个json文件转化为Object变量
# json file: person.json
{
"name":"John",
"age":42
}
# WDL read
workflow demo{
File json_file = "person.json"
Object p = read_json(json_file)
...
call record{
input:
name = p.name,
age = p.age
}
}
输出函数以write_tsv为例:将一个WDL的二维数组转化为一个文件(路径)作为参数
task write_record{
Array[Array[String]] my_table
command{
cat ${write_tsv(my_table)}
}
...
}
信息获取函数
与其他语言类似
-
glob:获取某一类型文件,返回文件数组
-
defined:判断变量是否被定义,返回布尔值True/False
-
select_first:输入为数组,返回某个不为空的元素。很重要的函数!
WDL的空为NULL
变量操作函数
粘合task之间工作
-
prefix:为数组变量加上前缀。对于同类型的多输入文件非常重要!
-
sub:提供正则表达式功能(不建议在WDL中使用)
小结
-
WDL内置函数集主要是针对流程串写而设置的,因此和一般语言略有不同
-
可通过WDL内置函数进行文件与变量之间的转化
-
除上述函数外,WDL还有十分丰富的功能函数,用户可根据需求使用
https://www.bilibili.com/video/BV1KL411V7iz/?spm_id_from=333.788.recommend_more_video.3