2013-01-23 106 views
0

我使用awk來計算一些總和,並且我想將它們存儲在一個文件中。從awk獲取結果並將其打印到文件中

這裏是我的輸入文件:

misses 15 
hit 18 
misses 20 
hit 31 

我想打印的總失誤和總點擊在文件中。

如果我運行此:

awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

我看到他們在終端。

現在我想寫一個文件:

我嘗試這樣做:

#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

echo misses $misses > $1; #first one overwrites the previous $1 is the argument given in the command line 
echo hits $hits>> $1; # all the othes append to the .txt file 

$misses, and $hits沒有價值。

我也試過這樣:

#!/bin/bash 
result= $(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
# $NF if I want the last column 
echo $result 

,我在網絡上看到了,爲了看什麼$結果將返回我,但我得到這個錯誤:

./test2.sh: line 2: Hits:: command not found 

回答

3

hitsmisses只是awk之內的變量,不在awk之後的shell中退出。只要做到以下幾點:

#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt > $1 

在你的第二次嘗試,你不能把一個空間 '=' 後:

result=$(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
1

簡單地將輸出重定向awk命令的:

awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt >file.txt 

重定向操作符>可以被附加到任何SH ell命令將其標準輸出重定向到文件。如您所知,將其更改爲>>會將命令的輸出追加到文件中,而不是完全覆蓋文件。

編輯:

的原因,這沒有奏效:

#!/bin/bash 
awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt 

echo misses $misses > $1; #first one overwrites the previous $1 is the argument given in the command line 
echo hits $hits>> $1; # all the othes append to the .txt file 

是因爲$失誤和命中$本地變量到awk腳本。因此外殼在這個語句之外並不知道它們,所以當你試圖回聲它們時,你會得到空白。

,這不起作用:

#!/bin/bash 
result= $(echo $output | awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 
# $NF if I want the last column 
echo $result 

多種原因。

1)分配在bash變量時,你不能有等號周圍的空白,所以第二行必須開始:

`result=$(echo...` 

2)您的替換(echo $output)內部回聲聲明是不必要的。這是因爲:a)$output未定義,所以echo不產生輸出,以及b)管道中的第二條語句(awk語句)完全忽略了管道中它之前的命令的標準輸出,因爲您已爲它指定了文件名行事(t.txt)。所以第二行可能只是:

result=$(awk 'BEGIN { hits=0; misses=0; } /^hit/{ hits+=$2}; /^misses/{misses+=$2}; END {print "Hits: " hits "\nMisses: " misses }' t.txt) 

3)在最後的回聲聲明將顯示結果都在同一行,儘管事實上,awk的語句打印兩行。這是因爲你沒有在你的echo語句中引用這個變量。試試這個來代替:

echo "$result" 

如在bash腳本的規則,你應該總是給你傳遞的變量或打印,除非你肯定知道你爲什麼不想。

希望能夠幫助您更多地瞭解您所嘗試的內容!

0

這裏是一個更緊湊的解決方案:

#!/bin/bash 
awk ' 
    {tally[$1] += $2} 
    END { 
     for (outcome in tally) { 
      print outcome ":", tally[outcome] 
     } 
    }' t.xt > $1 

你不必在AWK中初始化變量。第一次使用它時,AWK將假定數字爲0,或者「」爲字符串,取決於上下文。

相關問題