LINUX.ORG.RU

awk не печатает...

 


0

1

...на самом деле наоборот, печатает много лишнего. В общем,

for i in {1..200} ; do echo string $i  ; done | gawk '{str+=1 ; strdat[str]=$0; ; if (length(strdat)>10) delete strdat[str-10]; num=asorti(strdat, strdats, "@ind_num_asc");  for (i=1; i<num; i++) print strdat[strdats[i]] > "/tmp/blah" }'

rain@elitebook:/tmp$ wc -l blah 
1755 blah


Хотя если

for i in {1..200} ; do echo string $i  ; done | gawk '{str+=1 ; strdat[str]=$0; ; if (length(strdat)>10) delete strdat[str-10]; num=asorti(strdat, strdats, "@ind_num_asc");  for (i=1; i<num; i++) print strdat[strdats[i]]; print "------" }'

то с виду вроде все ок - видим по десятку строк за каждый проход цикла по массиву, разделенные линией. Т.е., в файле ожидается увидеть один блок (9 строк); какого черта он туда сваливает все, как будто делается append (>>)?

★★★★★

Вот если вынести цикл в } END {, тогда все ок при любом раскладе. Но мне так не подходит.

YAR ★★★★★
() автор топика

С пятью звёздами не научится нормально форматировать код не в одну строку это пушка.

anonymous
()
Ответ на: комментарий от anonymous

Уж извини, в консоли правлю как однострочник. Как было - так и скопипастил.

for i in {1..200}
    do
        echo string $i
done | gawk '{
        strdat[NR]=$0
        if (length(strdat)>10) delete strdat[NR-10]
        num=asorti(strdat, strdats, "@ind_num_asc")
        
        for (i=1; i<num; i++) print strdat[strdats[i]] > "/tmp/blah"
}'


Так лучше? Или лишь бы прицепиться?

YAR ★★★★★
() автор топика
Последнее исправление: YAR (всего исправлений: 1)

Раз не печатает — заведи для этого секретаршу, ну или у Саныча одолжи.

anonymous
()

Ничего не понял, но, видимо, нужен, close().

$ for i in {1..200} ; do echo string $i  ; done | gawk '{str+=1 ; strdat[str]=$0; ; if (length(strdat)>10) delete strdat[str-10]; num=asorti(strdat, strdats, "@ind_num_asc");  for (i=1; i<num; i++) print strdat[strdats[i]] > "/tmp/blah"; close("/tmp/blah") }'

$ wc -l /tmp/blah 
9 /tmp/blah

unterwulf
()
Ответ на: комментарий от unterwulf

Тьфу, черт, и ведь делал же такой вариант, но кавычки в close не поставил. Спасибо, работает.

Ничего не понял

Поток от софтины-майнера гонится через awk, который выполняет действия по ключевым словам (считает паттерны, ловит фейлы, выполняя при этом команды, ну и печатает на выход то, что пришло на вход). Попутно захотелось реализовать отображение последних строк в веб-морде. Такой себе tail для потока, но обновляющий файл назначения на каждую новую приходящую строку.

YAR ★★★★★
() автор топика
Ответ на: комментарий от unterwulf

А не подскажешь, удаление индекса массива вообще возможно? Т.е.,


rain@elitebook:/tmp$ echo | awk '{
arr["a"]=1
arr["b"]=1
arr["c"]=1

print "before: "arr["b"]

delete arr["b"]

print "after: "arr["b"]

for (z in arr) print z
}'
before: 1
after: 
a
b
c



Вот как сделать, чтобы в arr были только индексы a и c?

YAR ★★★★★
() автор топика
Ответ на: комментарий от YAR

Вот как сделать, чтобы в arr были только индексы a и c?

Ирония в том, что элемент с индексом b корректно удаляется в строке

delete arr["b"]

но потом заново инициализируется (на этот раз пустой строкой) в строке

print "after: "arr["b"]

:)

unterwulf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.