2015-04-01 61 views
0

我在數組上有一個for循環。我目前一直在尋找11美元的領域。但是,現在我想要做的是每次都檢查一個不同的領域。awk在循環時遞增輸入字段

  • i是第一個元素時,我想看看$11字段。
  • i是第二個元素時,我想查看$12字段。
  • i是第三個,我想看看$13字段。

我目前正在使用:

for i in "${array[@]}" 
do 
    awk -v OFS="\t" -v str1="$i" -v thr="$THR" '{ if($11>=thr) print "chr" $1, $2 ,$3 , str1 ;}' comb.txt > $i".bed"  
done 

我怎樣才能做到這一點?

我的變量如下:

STR1="CD45RA+_naive" 
STR2="CD45RO+_mem" 
STR3="CD127-_Treg" 
STR4="IL17-_Th_stim_MACS" 
STR5="IL17+_Th17_stim" 
array=($STR1 $STR2 $STR3 $STR4 $STR5) 
THR=10 
+0

請添加一小組樣本數據以及該數據所需的輸出。 2行應該足夠了。祝你好運。 – shellter 2015-04-01 15:45:19

+0

這不是關於輸出,而是關於下一輪而不是$ 11 $ 12,只是增加了我所看到的領域。 – Tonja 2015-04-01 15:49:16

回答

2

給定一個數組names,可以遍歷它的價值和做知道指數:

for ((i=0; i<${#names[@]}; i++)) 
do 
    echo "$i, ${names[$i]}" 
done 

例如,

$ names=('a' 'b' 'c') 
$ for ((i=0; i<${#names[@]}; i++)); do echo "$i, ${names[$i]}"; done 
0, a 
1, b 
2, c 

基於這種邏輯,在你的情況下,你可以說:

for ((i=0; i<${#array[@]}; i++)) 
do 
    awk -v index="$i" -v str1="${names[$i]}" -v thr=$THR '{ if($(index+11)=>thr) ... }' comb.txt 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^ 
done 

也就是說,你在$提供索引i爲index到AWK和str${names[$i]}。然後,在awk代碼中,您可以使用index + 10或任何您需要使用該數字的方式來使用索引值。

+0

@Tensibai感謝您的編輯!由於我也在編輯,我們的版本之間似乎有衝突(http://stackoverflow.com/posts/29395267/revisions),我看不到你改變了什麼。隨意再做一次! – fedorqui 2015-04-01 15:53:58

+1

這只是第一行的一個小錯字('namese'而不是'names'):) – Tensibai 2015-04-01 15:55:16

+1

最後,我在awk中訪問字段的方法做了一些改進,'$()'是不直觀,我認爲 – Tensibai 2015-04-01 16:01:35