2014-01-23 89 views
0

我有數百個包含類似於此行的文件的:錯誤awk命令的回聲管道輸送到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 

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

非常感謝。

回答

1

假設你正在使用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. 最後但並非最不重要,您需要修復小寫'N'filename

+0

春天來了!是的,除了-v和x =的東西,我總是忘記它是',不是'。非常感謝@nickie。完美的作品。 – cer

+0

也@nickie,非常感謝你的解釋。 – cer

3

你不需要wc -l管,甚至不需要爲文件名的循環,試試這個:

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

這是絕對正確的。 – nickie

+0

@nickie有一個解決方案,但我很好奇你的,我正在運行它,我收到一個值,而不是40個值。我錯過了什麼? – cer

+0

您是否刪除了'wc -l'? – nickie

0

這裏,我給了完整的腳本:

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