我是 bash 中关联数组的新手,所以如果我在某处听起来很傻,请原谅我。假设我正在阅读一个大文件并使用 bash(版本 = 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
但在这种情况下,我的数组最终为空。我当然可以将我需要的所有文件都放在一个文件中,然后将它们保存到一个文件中,我可以像上面一样使用,但是知道如何创建一个关联数组来存储来自多个不同文件的数据会很好。
非常感谢你!
您一开始可能不应该这样做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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句