我有一个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 =

大家有帮助吗?

#1楼 票数:3 已采纳

要构建关联数组,请尝试以下操作:

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到echo而不带双引号的情况。

  • 使用while循环从进程替换( <(...) )中读取每条输出行。
  • 每个assoc的密钥 数组条目是通过从每个输入行的第一个空格分隔的标记中chr前缀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对键进行排序会将XY类的非数字键放在输出的数字键之前

  • $(( ${proVar[$key]} / 50 ))计算=字符数。 显示,在算术扩展中使用整数除法。
  • $(seq ...)的目的是简单地创建与= chars一样多的标记 (参数)。 应该显示(创建的令牌是数字,但其内容无关紧要)。
  • printf '=%.s' ...是一种技巧,可以有效地打印出许多=字符。 因为格式字符串后面有参数。
  • printf '%s\\n' "${!proVar[@]}" | sort -n printf '%s\\n' "${!proVar[@]}" | sort -n对assoc的键进行printf '%s\\n' "${!proVar[@]}" | sort -n 数组以数字方式表示,其输出通过进程替代输入到while循环,因此该循环以排序顺序遍历键。

#2楼 票数:0

您可以使用括号在分配中创建数组:

proVar=(`awk '{printf ("%s\t\n"), $1}' file.txt | grep -P 'pattern' | uniq -c`)

没有内置的方法可以直接从输入创建关联数组。 为此,您需要一个附加循环。

  ask by areyoujokingme translate from so

未解决问题?本站智能推荐:

2回复

用户输入的Bash阵列键

因此,我有一个bash脚本,它将扫描目录并在选定的输入上运行功能。 似乎由于某种原因,密钥未从阵列正确设置。 我想念什么? 非常感谢所有帮助! 编辑:作为旁注,我可以单独运行命令并获得结果。 这是那些像我一样陷入困境的人的工作代码:
2回复

为什么&之后没有返回该命令到shell?

在Ubuntu 14.04中,我创建了以下bash脚本: 这个想法是锁定$ 1中指定的文件(flock),然后在我通常的编辑器中打开它(xdg-open),最后返回到提示符,因此我可以依次打开其他文件(&)。 但是,&不能按预期工作。 我需要按Enter键才能再次显示shell提
1回复

打开多个选项卡并在shell脚本中执行命令

我正在使用此scirpt使用shell脚本打开多个选项卡。 称之为multitab.sh并以这种方式执行user@user:~$ sh multitab.sh 目前这个脚本应该打开3个标签,所有这些标签都会执行python命令。 但是当我执行它时,抛出错误 这个错误的原因
1回复

将split命令的输出写入单独的目录

所以我使用split命令将文件拆分成单独的行,并将它们保存到与我正在执行命令的当前目录不同的目录中。 所以我希望输出文件写在toindex/ ,但是这给了我一个错误说: split: extra operand 'toindex/' 。 如果我没有输出目录路径或没有前缀(“文件”),这
2回复

使用Shell脚本在配置文件中添加行

这个问题已经在这里有了答案: 如何在sed中转义单引号? 6个答案 我有一个config.js文件,内容在字符串下面 我想读取此文件并替换.constant('Digin_Engine_API'我尝试使用sed但ddnt起作用后的所有内容。这就是我用于se
1回复

如何从另一个Shell脚本运行Shell脚本

我最近在Ubuntu上安装了tomcat8。 它位于/opt/tomcat/apache-tomcat-8.0.36/bin中,需要手动运行./shutdown.sh和./startup.sh。 有人可以建议我一个可以启动,关闭甚至重新启动服务器的shell脚本吗? 提前致谢。
1回复

无法从其他Shell脚本运行Shell脚本

我正在尝试运行一个调用另一个Shell脚本的Shell脚本: 我收到以下错误: 我尝试使用: chmod +x file2.sh 当我再次运行脚本时,出现了另一个错误: 我在这里想念什么...? 谢谢。 (我在Oracle VM VirtualBox的ubu
4回复

在 shell 脚本中解压缩文件时出错。 - 需要PK兼容。 v5.1(可以做v4.6)

我在 Shell 脚本中使用unzip test.zip 。 但是在执行这一行时我得到一个错误 即使我尝试从 ubuntu 的终端运行这个单个命令,它也会抛出相同的错误, need PK compat. v5.1 (can do v4.6) need PK compat. v5.1 (can d