在bash中将几个文件读入关联数组(> 4.0)

时间:2018-03-22 15:45:01

标签: arrays bash associative-array

我是bash中关联数组的新手,所以如果我在某个地方听起来很傻,请原谅我。让我们说我正在阅读一个大文件并使用bash(version = 4.2.46)关联数组来存储基因的FDR值。对于一个文件,我只是在做:

declare -A array

while read ID GeneID geneSymbol chr strand exonStart_0base exonEnd upstreamES upstreamEE downstreamES downstreamEE ID IJC_SAMPLE_1 SJC_SAMPLE_1 IJC_SAMPLE_2 SJC_SAMPLE_2 IncFormLen SkipFormLen PValue FDR IncLevel1 IncLevel2 IncLevelDifference; do 
    array[$geneSymbol]="${array[$geneSymbol]}${array[$geneSymbol]:+,}$FDR" ; 
done < input.txt

这将存储我可以通过

打印的FDR值
    for key in "${!array[@]}"; do echo "$key->${array[$key]}"; done 

# Prints out
"ABHD14B"->0.285807588279,0.898327660004,0.820468496328
"DHFR"->0.464931314555,0.449582575347
...

我天真地试图通过我的阵列读取几个文件

declare -A array

find ./aligned.filtered/rMAT*/MATS_output/SE.MATS.JunctionCountOnly.txt  -type f -exec cat {} + | 

while read ID GeneID geneSymbol chr strand exonStart_0base exonEnd upstreamES upstreamEE downstreamES downstreamEE ID IJC_SAMPLE_1 SJC_SAMPLE_1IJC_SAMPLE_2 SJC_SAMPLE_2 IncFormLen SkipFormLen PValue FDR IncLevel1 IncLevel2 IncLevelDifference; 
do  array[$geneSymbol]="${array[$geneSymbol]}${array[$geneSymbol]:+,}$FDR" ;  
done

但在这种情况下,我的数组最终为空。我当然可以捕获我需要的所有文件并将它们保存到我可以使用的单个文件中,但是知道如何创建一个关联数组来存储来自几个不同文件的数据会很好。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可能不应该首先在bash中执行此操作,但您的主要问题是while循环在由管道引起的子shell 中运行。使用流程替换来反转关系。

(另外,不要给你实际不使用的所有字段命名;只需将该行拆分为索引数组,然后挑选出你真正想要的两个字段。)

while read -a fields; do
  geneSymbol=${fields[1]}
  FDR=${fields[...]}   # some number; i'm not counting
  array[$geneSymbol]="${array[$geneSymbol]}${array[$geneSymbol]:+,}$FDR"
done < <(find ./aligned.filtered/rMAT*/MATS_output/SE.MATS.JunctionCountOnly.txt  -type f -exec cat {} +)

find可能没有必要;只需将while循环放在for循环中:

for f in ./aligned.filtered/rMAT*/MATS_output/SE.MATS.JunctionCountOnly.txt; do
  while read -a fields; do
    ...
  done < "$f"
done