簡體   English   中英

在bash數組中獲取shell命令的輸出

[英]Getting output of shell command in bash array

我有一個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到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循環,因此該循環以排序順序遍歷鍵。

您可以使用括號在分配中創建數組:

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

沒有內置的方法可以直接從輸入創建關聯數組。 為此,您需要一個附加循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM