簡體   English   中英

傳送到wc -l的awk命令的Echo錯誤

[英]Error in Echo of awk command piped to wc -l

我有數百個文件包含類似於以下內容的行:

>34764998   Halalkalicoccus_jeotgali_B3   -132.6938   Halalkalicoccus   0.528  Halobacteriaceae  0.638 Halobacteriales   0.648 Halobacteria   0.706 Euryarchaeota  0.850 

我有興趣計算第5列中小於0.1,... 0.95的項目數。 我編寫了一個bash腳本,該腳本調用AWK命令以查看評估列值,然后將其通過管道傳送到wc -l(請參見下文)。 但是,我的$,'和方括號排列得不太正確。 誰能告訴我我做錯了什么? 這可能不是最有效的方法,所以我歡迎您提出建議,但是我確實想知道我對所列代碼做錯了什么。

for fileName in 4440319.3_genus.txt 4440372.3_genus.txt 4440373.3_genus.txt 4440378.3_genus.txt 4440379.3_genus.txt 4440380.3_genus.txt 4440381.3_genus.txt
do
   echo $fileName
   for number in 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95
   do  
      #NUM={awk '$5 < '$number' {print $5}' $filename | wc -l}
      NUM={awk '$5 < $number {print $5}' $filename | wc -l} 
      #NUM=${awk '$5 < '$number' {print $5}' $filename | wc -l}
      #NUM=${awk '$5 < $number {print $5}' $filename | wc -l}
      echo $NUM
   done
done
exit 0

所有變化都會產生無效的選項錯誤,具體取決於未注釋的行。

非常感謝你。

您不需要wc -l管道,甚至不需要文件名的for循環,請嘗試以下操作:

awk -v n=0.95 '$5<n{a++}END{print a}' *_genus.txt

假設您使用的是shbash ,這就是我要做的:

NUM=`awk -v x=$number '$5 < x {print $5}' $fileName | wc -l`

解釋為什么這行得通並且您的嘗試行不通的一些解釋:

  1. 您需要執行管道並將其輸出存儲在變量NUM 這就是為什么您需要在管道周圍使用反引號。

  2. 您的$number是一個shell變量。 Shell變量擴展不會在單引號內進行,因此awk腳本中的$number不可能被所需的數字替換。 為了解決這個問題,您可以使用雙引號將數字嵌入正確的位置(由於awk腳本中的其他美元符號您不希望將其進行外殼擴展,因此會造成一些麻煩),或者您可以使用外部初始化的awk變量。 這就是-v參數的作用。

  3. 最后但並非最不重要的一點是,您需要在filename修復小寫字母“ N”。

這里我給出完整的腳本:

for fileName in 4440319.3_genus.txt 4440372.3_genus.txt 4440373.3_genus.txt 4440378.3_genus.txt 4440379.3_genus.txt 4440380.3_genus.txt 4440381.3_genus.txt
do
   echo $fileName
   for number in 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95
   do  
      NUM={awk -v n=$number '$5<n{a++}END{print a}'} 
      echo "$NUM records is less than $number"
   done
done
exit 0

暫無
暫無

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

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