Как сохранить содержимое переменной sum
в этой операции?Записать содержимое переменной в файл
$ seq 1 5 | awk '{sum+=$1} end {print sum; echo "$sum" > test_file}'
Как сохранить содержимое переменной sum
в этой операции?Записать содержимое переменной в файл
$ seq 1 5 | awk '{sum+=$1} end {print sum; echo "$sum" > test_file}'
echo
не будет работать в команде awk. Попробуйте это:
seq 1 5 | awk '{sum+=$1} END {print sum > "test_file"}
Чтобы написать вывод в файл, вы должны перенаправить "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
Вам не нужно awk
для этого. Вы можете сказать:
$ seq 5 | paste -sd+ | bc > test_file
$ cat test_file
15
Этот вопрос помечен 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'
Похоже, ты путаешь Синтаксис 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's перенаправление. Тем не менее, он использует тот же синтаксис, как BASH:
$ seq 1 5 | awk '{ sum += $1 } END { print sum > "test_file" }'
Обратите внимание, что имя файла в кавычки, или Awk будет считать, что test_file
является переменной, и вы получите ошибку о перенаправлении на нулевой файл имя.
+1 для очень хорошего объяснения. – fedorqui
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
LOL это, должно быть, шутка! Вы выигрываете награду за самый смешной ответ года. –
Так что только что увидели эти комментарии, когда кто-то проголосует сегодня. Это прекрасно, просто дайте кому-то идею, по которой вы можете выполнять свою работу по-разному. Если вы не поклонники «Sed», тогда вы не поймете, как возбуждающая логика в нем. – BMW
Затем вам нужно установлен 'bc'. На 'ubuntu' вы по умолчанию' awk', но не 'bc'. – Jotne