我有一个uniq -c输出,它输出大约7-10行,每个唯一的行模式都重复了每个模式的计数。我想将uniq -c file.txt的输出存储到bash数组中。现在,我所能做的就是将输出存储到变量中并打印出来。但是,bash当前认为整个输出只是一个很大的字符串。
bash如何识别分隔符?如何将UNIX Shell命令输出存储为Bash数组?
这是我当前的代码:
proVar=`awk '{printf ("%s\t\n"), $1}' file.txt | grep -P 'pattern' | uniq -c`
echo $proVar
而我得到的电流输出为:
587 chr1 578 chr2 359 chr3 412 chr4 495 chr5 362 chr6 287 chr7 408 chr8 285 chr9 287 chr10 305 chr11 446 chr12 247 chr13 307 chr14 308 chr15 365 chr16 342 chr17 245 chr18 252 chr19 210 chr20 193 chr21 173 chr22 145 chrX 58 chrY
这是我想要的:
proVar[1] = 2051
proVar[2] = 1243
proVar[3] = 1068
...
proVar[22] = 814
proVar[X] = 72
proVar[Y] = 13
从长远来看,我希望基于每个索引的计数来创建一个条形图,其中每50个计数等于一个“ =”号。希望它看起来像下面的样子
chr1 ===========
chr2 ===========
chr3 =======
chr4 =========
...
chrX ==
chrY =
大家有帮助吗?
要构建关联数组,请尝试以下操作:
declare -A proVar
while read -r val key; do
proVar[${key#chr}]=$val
done < <(awk '{printf ("%s\t\n"), $1}' file.txt | grep -P 'pattern' | uniq -c)
注意:这假定命令的输出由多行组成,每行包含一对键值对;每行包含一个键值对。问题中显示的单行输出来自传递$proVar
给回声而没有双引号的情况。
while
循环从流程替换(<(...)
)中读取每条输出线。chr
从每个输入行的第一个空格分隔的标记中删除前缀而形成的,而值是行的其余部分(在分隔空间之后)。要创建条形图,请使用:
while IFS= read -r key; do
echo "chr${key} $(printf '=%.s' $(seq $(( ${proVar[$key]} / 50 ))))"
done < <(printf '%s\n' "${!proVar[@]}" | sort -n)
注意:使用sort -n
该键排序将会把非数字键,如X
与Y
之前在输出数字的。
$(( ${proVar[$key]} / 50 ))
计算=
字符数。在算术扩展中使用整数除法显示。$(seq ...)
是简单地创建与char一样多的标记(参数)=
。应该显示(创建的令牌是数字,但其内容无关紧要)。printf '=%.s' ...
是有效打印尽可能多=
字符的技巧。因为格式字符串后面有参数。printf '%s\n' "${!proVar[@]}" | sort -n
排序assoc的键。数组以数字方式表示,其输出通过过程替换馈送到while
循环,因此循环按排序顺序遍历键。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句