2013-01-23 82 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,或者“”为字符串,取决于上下文。

相关问题