讀研期間摸索的linux無名管道,這是個(gè)神器。GWAS第一步——STAR原始基因組測(cè)序數(shù)據(jù)代碼如下:
#!/bin/bash
## path
star_index=/sharedata/home/xxx/xxx/project/GWAS/genome/star
star_mapping1=/sharedata/home/xxx/xxx/project/GWAS/07_star
rawdata=/sharedata/home/xxx/xxx/project/swrnaseq/raw_data/sweet/cleandata
sample_list=/sharedata/home/xxx/xxx/project/GWAS/script/list.txt
# 讀取樣本列表文件中的樣本名
samples=$(cat "$sample_list")
# arrange tasks by IP adrress.
# 獲取本機(jī)IP地址
ip_address=$(ip addr show enp89s0f1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
# 根據(jù)IP地址的最后一位數(shù)字決定處理前100個(gè)還是后100個(gè)數(shù)據(jù)
last_digit=$(echo "$ip_address" | cut -d'.' -f4)
# 根據(jù)不同的條件處理文件列表
if [ "$last_digit" -eq 11 ]; then
files_to_process=$(ls ${gatk_markup}/*.q30.sort.markdup.bam | head -n 140)
threads1=16
threads2=16
key=75
elif [ "$last_digit" -eq 12 ]; then
files_to_process=${samples}
threads1=32
threads2=10
key=30
else
echo "Unsupported IP address configuration!"
exit 1
fi
# structure core function
function GWAS_genotype() # 和子進(jìn)程中的命令相對(duì)應(yīng)
{
STAR --runMode alignReads --runThreadN ${threads1} --genomeDir ${star_index} --outFileNamePrefix ${star_mapping1}/${name} --outSAMmapqUnique 255 --outSAMtype BAM SortedByCoordinate --outBAMsortingThreadN ${threads2} --readFilesCommand gunzip -c --outSJfilterReads Unique --readFilesIn ${rawdata}/${name}_1.fq.gz ${rawdata}/${name}_2.fq.gz
}
# using pipe
# 創(chuàng)建一個(gè)管道
mkfifo melist
# 給子進(jìn)程管道綁定文件描述符6
exec 7<>melist
# 再創(chuàng)建一個(gè)管道(鎖文件),用于解決線程安全問題给猾,和唯一子進(jìn)程配對(duì)
mkfifo melock
# 綁定文件描述符3
exec 8<>melock
# 事先向鎖文件中插入1條數(shù)據(jù)(解鎖)
echo >melock
# 開啟多個(gè)子進(jìn)程
for ((i=1; i <= ${key} ; i++)); do
# 這里的 & 會(huì)開啟一個(gè)子進(jìn)程執(zhí)行
{
# 先讀取鎖文件(加鎖),由于鎖文件中只有1條數(shù)據(jù)交排,讀取完之后鎖文件空了其他子進(jìn)程再讀取時(shí)只能等待
while read -t 1 < melock && read -t 1 name < melist; do
# 讀取到業(yè)務(wù)數(shù)據(jù)后立即向?qū)懭?條數(shù)據(jù)到鎖文件(解鎖),讓其他子進(jìn)程繼續(xù)讀取數(shù)據(jù)
echo > melock
# 以下是子進(jìn)程拿著for變量執(zhí)行命令,這時(shí)候子進(jìn)程還沒還牌子
name=$(basename "${name/_1.fq.gz}") # basename是去掉路徑前綴只保留文件名前綴
echo "GWAS_analysis start ${name}" # echo表示可視化輸出命令結(jié)果是什么樣
GWAS_genotype "${name}" # 表示函數(shù)名和它一樣
done
} &
done
# for進(jìn)行的循環(huán)收到子進(jìn)程的牌子蟹瘾,并將其處理的變量全部拿給管道
echo "$files_to_process" | while read -r name; do
echo "${name}" > melist
done
# 使用 wait 命令阻塞當(dāng)前進(jìn)程,直到所有子進(jìn)程全部執(zhí)行完
wait
echo "Finish all loops!!!"
# 全部結(jié)束后解綁文件描述符并刪除管道
exec 7<&-
exec 7>&-
rm -f melist
exec 8<&-
exec 8>&-
rm -f melock
#--------------------------------------------------------------
echo "Finish all analysis!!!"