2013-12-20 3 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

Этот вопрос помечен так здесь является чисто Баш решение:

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's перенаправление. Тем не менее, он использует тот же синтаксис, как 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

LOL это, должно быть, шутка! Вы выигрываете награду за самый смешной ответ года. –

+0

Так что только что увидели эти комментарии, когда кто-то проголосует сегодня. Это прекрасно, просто дайте кому-то идею, по которой вы можете выполнять свою работу по-разному. Если вы не поклонники «Sed», тогда вы не поймете, как возбуждающая логика в нем. – BMW

Смежные вопросы