2017-07-27 24 views
1

问题的第一部分有很多答案,即在两个图案之间打印线条。例如:在两个图案之间打印线条并休眠一秒钟然后重复至EOF

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 

等等直到文件的末尾。我广泛搜索,但无法找到第二个“暂停/等待”部分,因此我相信这不是一个重复的问题。

+1

你确定awk脚本正在做你所说的事吗? – JNevill

+1

为了说明问题,在给定示例数据的情况下,它不适用于我,并且如果没有for循环迭代记录中的字段,我无法看到它是如何工作的。如果执行for循环,那么在循环启动到下一个字段之前,可以在'/ END /'测试中实现'system(“sleep 10”)''。但这是一个有争议的问题,因为剧本似乎没有做到应有的功能。 – JNevill

+0

@JNevill其实你是对的,它打印出整个文件。但无论如何,我对awk命令不感兴趣,这只是一个例子。我想在问题中描述的内容。 – quanta

回答

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或其他有意义的东西。

+0

嗨,它仍然打印出一切!我想要一些符合这两种模式(开始和结束)的东西,并打印出一个这样的块并暂停一秒钟,然后找到下一个块等。 – quanta

+0

不,它确实如此,它确实显示了它在做什么我的答案。如果您有不同的体验,那么您的实际输入与您发布的输入不符,或者您没有使用gawk。 –

1

替代使用system("sleep 1")EdMorton所建议将管AWK的输出转换成一个bash while循环:

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

这将避免产卵每个睡眠操作的额外的外壳。

+0

我没有看到在任何地方使用的模式“开始”和“结束”,但至少它打印出单行,所以它对我很有用,尽管我发现了另一个与你非常相似的解决方案:'#!/ bin/bash当IFS =''读取-r行||时,为 [[-n“$ line”]];做 回声“$ line” sleep 1 done <“$ 1”'非常感谢。 – quanta

+0

我的意思是,使用EdMorten的awk脚本,从它中删除'system(“sleep 1”)'并将它传递给while循环。但这只是一个非常小的优化。 EdMorten的回答应该适合你。 – hek2mgl

相关问题