短小精悍有用代码

Posted by 琼脂糖 on September 16, 2019

bash,python,R的一些小功能性代码或者简单函数。学习和记录用。

bash

for loop

for smp in *_clean
do
	for file in  ${smp}/*.png
	do
		echo $file
	done
done
for smp in 00.prepare/*_1.fastq
do
	name=${smp//_1.fastq/}
	echo `basename ${name}_clean` >> sample.list
done

find . -maxdepth 1 -type d -name "[0-9]*" | xargs echo rm -rf 删除所有数字开头的文件夹 m find ./ -type f -mtime +5 | xargs -I {} rm {} 删除5天前的文件

if [[ "$group" = "FvsM" || "$group" = "SvsF" ]]; then;fi

语句较复杂时,一般用双方括号;括号中均有空格。变量需用引号引用。

(head -n 1 temp && tail -n +2 temp3| sort -k1,1 -u) > ${group}_${gene}.tsv 除去首行,其他排序去重

svn status | grep '\!' | cut -d\ -f2- -d specifies the delimeter (space), -f specifies the list of columns (all starting with the 2nd)

跳过前两列的sort (head -n 2 test.file && tail -n +3 test.file | sort) > newfile

grep tab ctrl+V tab

python

flat_list = [item for sublist in l for item in sublist]

元祖的解包。

pp = ("a", "b", "c")
print(pp)
a,b,c = pp

a b c

打印dict成tab 文件 zip中

my_dict = {'C1':[1,2,3],'C2':[5,6,7],'C3':[9,10,11]}
for row in zip(*([key] + (value) for key, value in sorted(my_dict.items()))):
    print(*row)

list里面是一个生成器。生成器和列表的差别就是,列表是中括号,生成器是圆括号。

list([key] + (value) for key, value in sorted(my_dict.items()))

[[‘C1’, 1, 2, 3], [‘C2’, 5, 6, 7], [‘C3’, 9, 10, 11]] key加中括号,单独成一个list,而value本身是一个list,两个相加就合并了。

zip(a_list) 将每个list的第n的元素放在第n个元祖中 zip(*a_list) 将每个list的

os.walk

os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。 os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

top – 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

  • root 所指的是当前正在遍历的这个文件夹的本身的地址
  • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
  • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
import os
for root, dirs, files in os.walk("./暂放", topdown=False):
    for name in files:
        print(os.path.join(root, name))
./暂放/1Super Simple Songs CD1.rar
./暂放/C++ Primer Plus  第6版  中文版.pdf
./暂放/生信算法finding hidden messages in DNA.pdf
./暂放/生物信息学算法导论英文版@www.jqhtml.com.pdf
./暂放/生物信息学算法导论(美)N.C.琼斯.pdf

脚本子进程 image.png

import subprocess
with open("test.txt", "w") as outfile:
    subprocess.Popen(["ls","-l"], stdout=outfile.fileno())

import os.path ref_name = os.path.basename(config[“ref”]) # ref.fa

将vcf文件读取python作为pandas表

#!/usr/bin/env python

import io
import os
import pandas as pd


def read_vcf(path):
    with open(path, 'r') as f:
        lines = [l for l in f if not l.startswith('##')]
    return pd.read_csv(
        io.StringIO(''.join(lines)),
        dtype={'#CHROM': str, 'POS': int, 'ID': str, 'REF': str, 'ALT': str,
               'QUAL': str, 'FILTER': str, 'INFO': str},
        sep='\t'
    ).rename(columns={'#CHROM': 'CHROM'})

awk

从外部传入变量 awk -v window=$window ‘’

R

dplyr:

每个样本求count百分比

df <- df %>% 
    group_by(sample) %>%
    mutate(Percentage=count/sum(count))

ggplot当把柱状图倒过来时,legend顺序总是和图相反。

全局变量 用 «- sapply类,在函数内部需要用num «- num + 1;否则,num值都是一样的

a$mean <- rowMeans(a[c(‘high’, ‘low’)], na.rm=TRUE) df中两列的均值 option 减号 直接打出 <-

colData.csv 定义好分组的先后顺序。 count.matrix的生成会来自colDData的顺序。 热图的顺序来自colData的顺序 A rule of thumb for the ‘kegg’ ID is entrezgene ID for eukaryote species and Locus ID for prokaryotes. orgdb(包含kegg PATH信息,即ko04610这种) SYMBOL 和 ENTREZID 是一一对应的(hsa) ENSEMBL会多一些。