问题的第一部分有很多答案,即在两种模式之间印刷线条。例如:
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
依此类推,直到文件结束。我进行了广泛的搜索,但找不到第二个“暂停/等待”部分,因此我认为这不是一个重复的问题。
答案 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
而不是count
或sum
或其他有意义的东西。
答案 1 :(得分:1)
根据EdMorton建议使用system("sleep 1")
的替代方法是将awk的输出传输到bash while
循环中:
awk ... | while read -r line ; do
echo "${line}"
sleep 1
done
这样可以避免为每次睡眠操作产生额外的shell。