[英]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
假設您使用的是sh
或bash
,這就是我要做的:
NUM=`awk -v x=$number '$5 < x {print $5}' $fileName | wc -l`
解釋為什么這行得通並且您的嘗試行不通的一些解釋:
您需要執行管道並將其輸出存儲在變量NUM
。 這就是為什么您需要在管道周圍使用反引號。
您的$number
是一個shell變量。 Shell變量擴展不會在單引號內進行,因此awk
腳本中的$number
不可能被所需的數字替換。 為了解決這個問題,您可以使用雙引號將數字嵌入正確的位置(由於awk
腳本中的其他美元符號您不希望將其進行外殼擴展,因此會造成一些麻煩),或者您可以使用外部初始化的awk
變量。 這就是-v
參數的作用。
最后但並非最不重要的一點是,您需要在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.