首页 > 解决方案 > 从 awk 生成的制表符分隔文件填充关联数组的疑难解答

问题描述

我使用samtoolsand生成了一个制表符分隔的文件awk。我正在尝试使用制表符分隔文件填充关联数组。然后,关联数组的键和值将在函数中用于下游分析。

当尝试使用代码填充关联数组时,文件行被读入$queryid并且制表符被转换为空格。除了下面显示的内容之外,IFS=\我还尝试过运行代码。IFS="\t"

samtools view $1 "NA" | awk 'BEGIN { OFS = "\t" } ; { print $1, $4 }' > "$3/$1_ReadStarts.txt"

declare -A Readstart
while IFS= read queryid startpos; do
  echo $queryid >> "$3/test.txt"#this line was added for troubleshooting
  Readstart[$queryid]=$startpos
  done < "$3/$1_ReadStarts.txt"

输入文件 ( ReadStarts.txt) 的一部分从生成samtoolsawk如下所示。应该是键或数组的$queryid(显示在 中)的一部分如下所示。test.txt它包含ReadStarts.txt应该存储在的第二列$startpos

ReadStarts.txt
NB501950:166:HVN2GBGXB:3:21607:13181:3898 13397
NB501950:166:HVN2GBGXB:3:23607:24238:3455 16224
NB501950:166:HVN2GBGXB:3:23402:1402620:

test.txt
NB501950:166:HVN2GBGXB:3:21607:13181:3898 13397
NB501950:166:HVN2GBGXB:3:23607:24238:3455 16224
NB501950:166:HVN2GBGXB:3:23402:1340220:968840220:66

标签: bashassociative-array

解决方案


您的任何IFS设置都不正确。IFS=取消设置变量的方法,而不是将其设置为等于空格。事实上,你根本不需要设置IFS,因为它默认为空格、制表符和换行符。

declare -A Readstart
while read -r queryid startpos; do
  echo "$queryid"
  echo "$startpos"
  Readstart[$queryid]="$startpos"
done < "stackOverflow.txt"

使用您提供的示例文件为我工作。


如果您以后需要知道如何设置IFS

  • 新队:IFS=$'\n'
  • 标签:IFS=$'\t'
  • 空间:IFS=' '

推荐阅读