在两个图案之间打印线条并睡眠一秒钟然后重复直到EOF

时间:2017-07-27 16:12:11

标签: awk sed pattern-matching sleep

问题的第一部分有很多答案,即在两种模式之间印刷线条。例如:

awk '/start/{flag=1} flag; /end/{flag=0}' file

这打印出在“文件”中多次出现的模式“开始”和“结束”之间的界限。假设文件包含:

start a b c d 4 5 3 7 8 end some garbage start 6 d 0 0 1 d g end other garbages start 6 5 ... end some other garbage

上面的“awk”命令打印出整个文件,消除了垃圾..这很好,但我想要的是每个这样的块之间的暂停。那是打印

start a b c d 4 5 3 7 8 end

休眠一秒钟(可以使用sleep 1),然后打印下一个块:

start 6 d 0 0 1 d g end

依此类推,直到文件结束。我进行了广泛的搜索,但找不到第二个“暂停/等待”部分,因此我认为这不是一个重复的问题。

2 个答案:

答案 0 :(得分:1)

使用GNU awk进行多字符RS:

$ cat tst.awk
BEGIN { RS="[[:space:]]+"; ORS=" " }
/start/ { found=1 }
found   { print }
/end/   { printf "\n"; found=0; system("sleep 1") }

$ time awk -f tst.awk file
start a b c d 4 5 3 7 8 end
start 6 d 0 0 1 d g end
start 6 5 ... end

real    0m3.214s
user    0m0.015s
sys     0m0.122s

请注意,变量名称应为found或类似的有意义的单词,而不是flag,因为标志是变量的类型,而不是它所代表的变量。命名标志变量flag就像命名整数变量integer而不是countsum或其他有意义的东西。

答案 1 :(得分:1)

根据EdMorton建议使用system("sleep 1")的替代方法是将awk的输出传输到bash while循环中:

awk ... | while read -r line ; do
    echo "${line}"
    sleep 1
done

这样可以避免为每次睡眠操作产生额外的shell。