Nextflow系列之三-备份

Nextflow的脚本语言是Groovy的拓展。

语言基础

变量
x = 1
println x

x = new java.util.Date()
println x

x = -3.1499392
println x

x = false
println x

x = "Hi"
println x

列表
myList = [1776, -1, 33, 99, 0, 928734928763]

println myList[0]

println myList.size()

映射
scores = [ "Brett":100, "Pete":"Did not finish", "Andrew":86.87934 ]

获取

println scores["Pete"]
println scores.Pete

增加或修改

scores["Pete"] = 3
scores["Cedric"] = 120

一次声明多个变量
(a, b, c) = [10, 20, 'foo']
assert a == 10 && b == 20 && c == 'foo'

条件控制
x = Math.random()
if( x < 0.5 ) {
    println "You lost."
}
else {
    println "You won!"
}

字符串
println "he said 'cheese' once"
println 'he said "cheese!" again'

字符串连接

a = "world"
print "hello " + a + "\n"

变量内插

单引号和双引号的区别在于,双引号支持变量内插

foxtype = 'quick'
foxcolor = ['b', 'r', 'o', 'w', 'n']
println "The $foxtype ${foxcolor.join()} fox"

x = 'Hello'
println '$x + $y'

会得到结果

The quick brown fox
$x + $y

多行字符串
text = """
    hello there James
    how are you today?
    """

在Bash中

myLongCmdline = """ blastp \
                -in $input_query \
                -out $output_file \
                -db $blast_database \
                -html
                """
result = myLongCmdline.execute().text

闭包

其中it为占位符

square = { it * it }

定义之后,可用于调用

println square(9)

使用collect函数

[ 1, 2, 3, 4 ].collect(square)

那么会得到

[ 1, 4, 9, 16 ]

也可以使用多个参数

printMapClosure = { key, value ->
    println "$key = $value"
}

[ "Yue" : "Wu", "Mark" : "Williams", "sudha" : "Kumari" ].each(printMapClosure)

那么会得到

Yue=Wu
Mark=Williams
Sudha=Kumari

myMap = ["China": 1 , "India" : 2, "USA" : 3]

result = 0
myMap.keySet().each( { result+= myMap[it] } )

println result

具体应该是参考 Groovy 的 文档

看几个示例,就可以了,其实有点像Perl

assert 'foo' =~ /foo/       // return TRUE
assert 'foobar' =~ /foo/    // return TRUE

assert 'foo' ==~ /foo/       // return TRUE
assert 'foobar' ==~ /foo/    // return FALSE

x = ~/abc/
println x.class
// prints java.util.regex.Pattern

y = 'some string' =~ /abc/
println y.class
// prints java.util.regex.Matcher

字符串替换
x = "colour".replaceFirst(/ou/, "o")
println x
// prints: color

y = "cheesecheese".replaceAll(/cheese/, "nice")
println y
// prints: nicenice

字符串捕获

似乎跟perl没啥区别

programVersion = '2.7.3-beta'
m = programVersion =~ /(\d+)\.(\d+)\.(\d+)-?(.+)/

assert m[0] ==  ['2.7.3-beta', '2', '7', '3', 'beta']
assert m[0][1] == '2'
assert m[0][2] == '7'
assert m[0][3] == '3'
assert m[0][4] == 'beta'

还可以直接捕获并赋予变量

programVersion = '2.7.3-beta'
(full, major, minor, patch, flavor) = (programVersion =~ /(\d+)\.(\d+)\.(\d+)-?(.+)/)[0]

println full    // 2.7.3-beta
println major   // 2
println minor   // 7
println patch   // 3
println flavor  // beta

基于模式去除字符串部分
// define the regexp pattern
wordStartsWithGr = ~/(?i)\s+Gr\w+/

// apply and verify the result
('Hello Groovy world!' - wordStartsWithGr) == 'Hello world!'
('Hi Grails users' - wordStartsWithGr) == 'Hi users'

assert ('Remove first match of 5 letter word' - ~/\b\w{5}\b/) == 'Remove  match of 5 letter word'

assert ('Line contains 20 characters' - ~/\d+\s+/) == 'Line contains characters'

文件和I/O
myFile = file('some/path/to/my_file.file')

类似bash,支持路径通配

listOfFiles = file('some/path/*.fa')

可以使用一些参数

listWithHidden = file('some/path/*.fa', hidden: true)

事实上,这个是一个Java的Path对象。

基本的读写

上述已经介绍了File对象的获取,有了file对象,可以打印其text属性(事实上,这个属性是整个文本的内容变成一个字符串

print myFile.text

也可以对该属性赋值,这一赋值会直接重写文件内容

myFile.text = 'Hello world!'

也可以对已经存在的文件,追加内容

myFile.append('Add this line\n')

或者使用

myFile << 'Add a line more\n'

对于二进制数据

binaryContent = myFile.bytes

或者

myFile.bytes = binaryBuffer

逐行读取文件

一次性读取文件

myFile = file('some/my_file.txt')
allLines  = myFile.readLines()
for( line : allLines ) {
    println line
}

更优雅的使用方式,

file('some/my_file.txt')
    .readLines()
    .each { println it }

上述会读入整个文件,无法处理大文件,推荐使用

count = 0
myFile.eachLine {  str ->
        println "line ${count++}: $str"
    }

增强的文件读取操作

可以创建Reader或者InputStream对象,那么就可以使用更多的读取方法

myReader = myFile.newReader()
String line
while( line = myReader.readLine() ) {
    println line
}
myReader.close()

myFile.withReader {
    String line
    while( line = myReader.readLine() ) {
        println line
    }
}

增强的输出操作

将文件的中的U全部替换为X

sourceFile.withReader { source ->
    targetFile.withWriter { target ->
        String line
        while( line=source.readLine() ) {
            target << line.replaceAll('U','X')
        }
    }
}

列出文件夹内容
myDir = file('any/path')

allFiles = myDir.list()
for( def file : allFiles ) {
    println file
}

遍历操作

myDir.eachFile { item ->
    if( item.isFile() ) {
        println "${item.getName()} - size: ${item.size()}"
    }
    else if( item.isDirectory() ) {
        println "${item.getName()} - DIR"
    }
}

创建目录
myDir = file('any/path')

result = myDir.mkdir()
println result ? "OK" : "Cannot create directory: $myDir"

创建多级目录

myDir.mkdirs()

创建链接
myFile = file('/some/path/file.txt')
myFile.mklink('/user/name/link-to-file.txt')

复制文件
myFile.copyTo('new_name.txt')

文件夹会自动复制内容

myDir = file('/some/path')
myDir.copyTo('/some/new/path')

移动文件
myFile = file('/some/path/file.txt')
myFile.moveTo('/another/path/new_file.txt')

移动或者重命名该文件夹,表现与linuxmv一致

myDir = file('/any/dir_a')
myDir.moveTo('/any/dir_b')

文件重命名
myFile = file('my_file.txt')
myFile.renameTo('new_file_name.txt')

删除文件
myFile = file('some/file.txt')
result = myFile.delete
println result ? "OK" : "Can delete: $myFile"

如果是要删除非空文件夹,那么使用deleteDir

查看文件属性
获取或者修改文件属性
permissions = myFile.getPermissions()

myFile.setPermissions('rwxr-xr-x')

或者

myFile.setPermissions(7,5,5)

HTTP/FTP文件
pdb = file('http://files.rcsb.org/header/5FID.pdb')

随后当成本地文件处理即可

println pdb.text
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容