簡體   English   中英

將多個shell腳本集成到一個腳本中

[英]Integrating several shell scripts into one script

我想將一些簡短的腳本集成到一個腳本中,我可以從命令行更新輸入文件的參數。 我要經歷22個文件並計算$5!="1" 以下是輸入文件的示例頭:目前,我有以下3個簡短腳本:

CHROM POS   N_ALLELES N_CHR {FREQ}
2   45895   2   162 0.993827    0.00617284
2   45953   2   162 0.993827    0.00617284
2   264985  2   162 1   0
2   272051  2   162 0.944444    0.0555556

1)計數行(保存為wcYRI.sh): $5!="1"{sum++}END{print sum}

2)應用linecount(保存為check-annos.sh): awk -f wcYRI.sh ~/folder$1/file$1

3)對22個文件應用linecount,求和輸出:

    for i in {1..22}; 
    do sh check-annos.sh $i; done 
    | awk '{sum+=$1}END{print sum}'

它相對簡單,但有時腳本1對於看起來像這樣的數據文件會更長一點:

Chr Start   End Ref Alt Func.refGene    Gene.refGene    ExonicFunc.refGene  AAChange.refGene    LJB2_SIFT   LJB2_PolyPhen2_HDIV LJB2_PP2_HDIV_Pred  LJB2_PolyPhen2_HVAR LJB2_PolyPhen2_HVAR_Pred    LJB2_LRT    LJB2_LRT_Pred   LJB2_MutationTaster LJB2_MutationTaster_Pred    LJB_MutationAssessor    LJB_MutationAssessor_Pred   LJB2_FATHMM LJB2_GERP++ LJB2_PhyloP LJB2_SiPhy
16  101593  101593  C   T   exonic  POLR3K  nonsynonymous SNV   POLR3K:NM_016310:exon2:c.G164A:p.G55E   0.000000    0.997   D   0.913   D   0.000000    D   0.999989    D   2.205   medium  0.99    5.3 2.477000    17.524

...我正在使用像這樣的awk文件(執行數組匹配)作為輸入-f到上面的腳本2:

NR==FNR{
    arr[$1$2];next
}   
    $1$2 in arr && $0~/exonic/&&/nonsynonymous SNV/{nonsyn++};
    $1$2 in arr && $0~/exonic/&&/synonymous SNV/ && $0!~/nonsynonymous/{syn++}
END{
    print nonsyn,"nonsyn YRI","\t",syn,"YRI syn"
}

我的目標是將這個過程集成一點,所以我不需要進入腳本2並且每次更改~/folder$1/file$1 - 我希望能夠使用~/folder$1/file$1作為命令行的輸入。 但是當我嘗試在命令行的for循環中使用這樣的東西時,它不會像$1被構建到由for-do-done循環調用的單獨腳本中那樣接受$1 (如腳本3 --ie腳本3將采用腳本2,但我不能只將腳本2的內容顯式輸入for-loop作為參數)。

我實際上並不那么擔心有一個單獨的AWK文件來處理行解析,主要的是讓我煩惱的是我正在為每個文件夾/文件集修改腳本2,我希望能夠從命令中執行此操作行,以便腳本知道我告訴它~/folder$1/file$1 ,循環數字1-22我可以為此過程保存一個通用腳本,因為我有許多文件夾/文件組合來查看。

任何建議都贊賞縮短管道,但特別是命令行參數問題讓我煩惱不已!

如果我正確理解了問題,我會看到兩種方法來處理它。 如果路徑格式一致(即數字始終出現兩次,在相同位置),則可以使腳本接受路徑的各個部分作為兩個不同的參數。 該腳本如下所示:

#!/bin/bash
folderPrefix="$1"
filePrefix="$2"

for num in {1..22}; do
    awk -f wcYRI.sh "$folderPrefix$num/$filePrefix$num"
done | 
    awk '{sum+=$1}END{print sum}'

...然后你用./scriptname ~/folder file運行它。 或者,如果您需要能夠更靈活地定義文件夾/文件路徑格式,您可以執行以下操作:

#!/bin/bash

for num in {1..22}; do
    eval "awk -f wcYRI.sh $1"
done | 
    awk '{sum+=$1}END{print sum}'

...然后用./scriptname '~/folder$num/file$num'運行它。 請注意,這里需要單引號,以便$var引用不會擴展,直到eval強制它們為止。

順便說一句,文件wcYRI.sh是一個awk腳本,而不是shell腳本,所以我建議更改其文件擴展名以防止混淆。 實際上,執行此操作(對於shell和awk腳本)的首選方法是在腳本中添加一個shebang行作為第一行(請參閱上面的示例;對於awk腳本,它將是#!/usr/bin/awk -f ),然后使腳本可執行,然后只用./scriptname運行它,讓shebang負責指定解釋器(sh,bash,awk -f,等等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM