由于在linux中处理流程时,有时候也需要用到shell脚本来串联程序,所以也和大家分享下我写Shell程序的脚本模板:
#!/bin/bash
#!/usr/bin/env bash
help()
{
cat <<HELP
---------------------------------------------------------------
Author: Myshu
Mail:myshu0601@qq.com
Version: 1.0
Date: 2020-04-12
Description:
---------------------------------------------------------------
USAGE: $0 <para1> <para2> ...
or $0 -h # show this message
EXAMPLE:
$0 para1 para2
HELP
exit 0
}
[ -z "$1" ] && help
[ "$1" = "-h" ] && help
in=$1
# 判断输出文件夹是否存在,若不存在则新建
out=$2
if [ ! -d "$out" ]; then
mkdir $out
fi
# 判断文件是否存在,存在则删除
rm file if [ -f file ]
echo ========== Start at : `date "+%Y-%m-%d/%H:%M:%S"` ==========
for i in $in/*.txt
do
# 提取文件名
name=$(basename $i _all.html)
# grep加上-P匹配变量
grep -P "^>$name\_" $i | sed 's/>\(.*\)<\/option>/\1/g' >> $name.tmp
# if 语句
if [[ $note = "NA" ]] && [[ $act = "NA" ]];then
continue
fi
# 读取文件
for id in `cat $name.tmp`
do
echo -e "$id\t$act\t$note" >> $out
done
done
echo ========== End at : `date "+%Y-%m-%d/%H:%M:%S"` ==========
1. 文件处理
# --- 1、逐行读取文件 ---
# 如果行包括空白符,则读取的时候空白会变成换行,解决办法
IFS_old=$IFS
IFS=$'\n'
for line in `cat rollback_config`
do
echo "$line"
done;
IFS=$IFS_old
# --- 2、读取第几行第几列 ---
# print 到后带的是你要获取第几列,sed -n 是指定第几行。
ls -l | awk '{print $5}' | sed -n '2p'
# --- 3、对fasta文件进行重新编号 ---
awk '{ if( $0 ~ />/){num++;print ">test_Tag"num;}else{print $0}}' test.fa.tmp > test.FinalTag.fa
# --- 4、利用数组读取文件 ---
pname=(t t Phylum_all Class_all Order_all Family_all Genus_all Species_all)
for l in 2 3 4 5 6 7
do
echo ${pname[$l]}
done
# --- 5、awk按照指定分隔符读取和输出文件 --
awk 'BEGIN{OFS="\t";FS="\t"}{print $1,$2,$3,$4}' test.txt
# FS指定输入分隔符
# OFS 指定输出分隔符
# RS 指定换行符,默认为\n
# ORS 指定输出换行符,默认为\n
# awk提取变量,使用两个双引号中间加个单引号
awk '{OFS="\\t"}{print "'"$sample"'",$4,$2,$5,$7,$8,$9,$10}'
2. 算术运算
((i=$j+$k)) 等价于 i=`expr $j + $k`
((i=$j-$k)) 等价于 i=`expr $j -$k`
((i=$j*$k)) 等价于 i=`expr $j \*$k`
((i=$j/$k)) 等价于 i=`expr $j /$k`
#通过改变$1可以指定哪一列,默认$1为第一列
列求和: cat you.txt |awk '{a+=$1}END{print a}'
列求平均值:cat you.txt |awk '{a+=$1}END{print a/NR}'
列求最大值:cat you.txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'
#统计fasta文件有多少条序列
grep ‘>’ S_pastorianus.fasta | wc –l
#统计fastq文件中reads数目
awk '{s++}END{print s/4}' file.fastq
#统计文件夹内文件个数以及文件夹个数
#统计某文件夹下文件的个数
ls -l |grep "^-"|wc -l
ls -l |grep "^d"|wc -l
# calculate mean vmem计算不同单位的一列数据的平均值的算法
grep "vmem" run.detail.15_or96 | cut -f 4 -d "," |cut -f 2 -d "=" | sed 's/M$/\/1024G/g' | sed 's/G//g' | awk '{sum+=$1} END {print "vmem average = ", sum/NR}'
3. 正则匹配和替换
# 变量的替换
var='abca'
echo ${var/a/c} # 替换一次
echo ${var//a/c} #替换所有
# grep替换
# 识别Tab
grep $'\tABN\t' test.txt
也可以使用shopt打开全局的匹配
# 删除test/文件夹下除了file1和file2之外的其他文件
# 打开extglob
shopt -s extglob
cd test/
rm -f !(file1|file2)
# 关闭extglob
shopt -u extglob
网友评论