[英]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.