如何在此操作中保存变量sum
的内容?
$ seq 1 5 | awk '{sum+=$1} end {print sum; echo "$sum" > test_file}'
答案 0 :(得分: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
即使用 shell 重定向。 >
出现在shell控制的Awk程序之外,并将标准重定向到文件test_file
。
您也可以在Awk内部重定向,但这是 Awk&#39> 重定向。但是,它使用与BASH相同的语法:
$ seq 1 5 | awk '{ sum += $1 } END { print sum > "test_file" }'
请注意,必须引用文件名,否则Awk会认为test_file
是变量,并且您将在重定向到空文件名时收到一些错误。
答案 1 :(得分:2)
要将输出写入文件,您必须重定向到"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 :(得分:1)
echo
在awk命令中不起作用。试试这个:
seq 1 5 | awk '{sum+=$1} END {print sum > "test_file"}
答案 3 :(得分:1)
您不需要awk
。你可以说:
$ seq 5 | paste -sd+ | bc > test_file
$ cat test_file
15
答案 4 :(得分:0)
这个问题用bash标记,所以这里有一个纯粹的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'
答案 5 :(得分:-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