2013-12-20 52 views

回答

2

echo在awk命令中不起作用。试试这个:

seq 1 5 | awk '{sum+=$1} END {print sum > "test_file"} 
3

要输入输出到一个文件,你必须重定向到"test_file"这样的:

$ seq 5 | awk '{sum+=$1} END{print sum > "test_file"}' 
$ cat test_file 
15 

你的版本是行不通的,因为你没有引用test_file,所以awk它被认为是一个变量。由于您之前没有定义它,因此awk无法正确重定向。 David W's answer解释得很好。

还要注意,seq 5相当于seq 1 5

在你想要的结果保存到一个变量的情况下,你可以使用var=$(command)语法:

$ sum=$(seq 5 | awk '{sum+=$1} END{print sum}') 
$ echo $sum 
15 
2

你不需要awk这一点。你可以说:

$ seq 5 | paste -sd+ | bc > test_file 
$ cat test_file 
15 
+1

然后,你需要安装'bc'。在'ubuntu'你有'awk',但不是'bc'作为默认值。 – Jotne

0

这个问题被打上所以这里是一个纯bash的解决方案:

for ((i=1; i<=5; i++)); do ((sum+=i)); done; echo "$sum" > 'test_file' 

或者这一个:

for i in {1..5}; do ((sum+=i)); done; echo "$sum" > 'test_file' 
3

它看起来像你混淆BASH语法和Awk。 Awk是一种编程语言,它与BASH语法非常不同。

$ seq 1 5 | awk '{ sum += $1 } END { print sum }' 
15 

你要拍摄15到一个文件:

$ seq 1 5 | awk '{ sum += $1 } END { print sum }' > test_file 

正在使用外壳的重定向。 >出现在外壳有控制权的Awk程序之外,并将标准重定向到文件test_file

您也可以在Awk中重定向,但是这是Awk的重定向。但是,它使用相同的语法BASH:

$ seq 1 5 | awk '{ sum += $1 } END { print sum > "test_file" }' 

注意文件名已被引用,或awk将假设test_file是一个变量,你会得到关于重定向到一个空文件中的一些错误名称。

+0

+1非常好的解释。 – fedorqui

-2

http://sed.sourceforge.net/grabbag/scripts/add_decs.sed

#! /bin/sed -f 

# This is an alternative approach to summing numbers, 
# which works a digit at a time and hence has unlimited 
# precision. This time it is done with lookup tables, 
# and uses only 10 commands. 

G 
s/\n/-/ 
s/$/-/ 
s/$/;9aaaaaaaaa98aaaaaaaa87aaaaaaa76aaaaaa65aaaaa54aaaa43aaa32aa21a100/ 

:loop 
/^--[^a]/!{ 
    # Convert next digit from both terms into analog form 
    # and put the two groups next to each other 
    s/^\([0-9a]*\)\([0-9]\)-\([^-]*\)-\(.*;.*\2\(a*\)\2.*\)/\1-\3-\5\4/ 
    s/^\([^-]*\)-\([0-9a]*\)\([0-9]\)-\(.*;.*\3\(a*\)\3.*\)/\1-\2-\5\4/ 

    # Back to decimal, but keeping the carry in analog form 
    # \2 matches an `a' if there are at least ten a's, else nothing 
    # 
    # 1-------------   3- 4---------------------- 
    #    2        5---- 
    s/-\(aaaaaaaaa\(a\)\)\{0,1\}\(a*\)\([0-9b]*;.*\([0-9]\)\3\5\)/-\2\5\4/ 
    b loop 
} 
s/^--\([^;]*\);.*/\1/ 
h 
+1

大声笑这一定是个笑话!你赢得了今年最荒谬的回答奖。 –

+0

刚刚看到这个评论,当有人今天投票表决。没问题,只要给别人一个你可以用不同方式完成工作的想法。如果你不是'Sed'粉丝,那么你就不会理解它是如何激发它的逻辑的。 – BMW