#基因组干货#生物信息学文本处理大杂烩(三)

这次讲awk 的数组及使用

awk 中数组叫做关联数组(associative arrays),因为下标可以是数字也可以是字符串。awk 中的数组不必提前声明,也不必声明大小,直接赋值就行。

# 可以用数值作数组索引(下标)
Tarray[1]=“cheng mo”
Tarray[2]=“800927”
# 可以用字符串作数组索引(下标)
Tarray[“first”]=“cheng ”
Tarray[“last”]=”mo”
Tarray[“birth”]=”800927”
# 也可以这样:
Tarray[“first”\t"last"]=”chengmo”
还是先创建bed文件:
# 使用 randomBed创建bed文件:
randomBed -seed 2 -n 1000 -l 400 -g ./hg19.chrom_24.sizes >./a.bed
# 查看前10行:
head a.bed
#基因组干货#生物信息学文本处理大杂烩(三)_第1张图片
这个bed文件显示的第四列是行号排序,现在我们想将它替换为相应的染色体的长度,比如chr1的长度是249250621,chr2的长度是243199373,这个信息是在hg19.chrom_24.sizes这个文件里有的:
# 查看hg19.chrom_24.sizes
cat hg19.chrom_24.sizes
#基因组干货#生物信息学文本处理大杂烩(三)_第2张图片
替换后的结果应该是这个样子的:
#基因组干货#生物信息学文本处理大杂烩(三)_第3张图片
第四列已经替换为了相应染色体长度。
代码及注释如下:
awk 'BEGIN{OFS="\t"}{
    # 在按行读第一个文件时将第二列数据存储到以第一列染色体名为下标的数组a里:
    if(NR==FNR){
        a[$1]=$2
        }
    # 读第二个文件,注意其中的a[$1]已经是a.bed中的$1.
    if(NR>FNR){
        print $1,$2,$3,a[$1],$5,$6
        }
    }' hg19.chrom_24.sizes a.bed >b.bed
还可以通过length函数获得数组长度,但awk有好几个版本,用的比较多的时gawk,在使用函数以及awk内置变量时应该安转gawk:
sudo apt-get install gawk
awk '{a[$1];print "当前数组长度为:",length(a)}' hg19.chrom_24.sizes
#基因组干货#生物信息学文本处理大杂烩(三)_第4张图片

随着读取行数增加,数组长度也在增加。


更多原创精彩内容敬请关注生信杂谈

#基因组干货#生物信息学文本处理大杂烩(三)_第5张图片

你可能感兴趣的:(#基因组干货#生物信息学文本处理大杂烩(三))