我需要每 60 秒从文件中复制 x 行,60 秒后,继续复制另外 60 秒,从上次复制重新开始?
#!/bin/bash
while true; do
sed -n -e '1,10000' input.yml > output.txt
sleep 60
done
谢谢
答案1
如果您想output.txt
在每次运行中覆盖:
#! /bin/sh -
while true; do
head -n 10000 > output.txt
sleep 60
done < input.yml
如果不:
#! /bin/sh -
while true; do
head -n 10000
sleep 60
done < input.yml > output.txt
那些副本取决于每 60 秒 10000 行。如果没有那么多行,则不会等到 10000 行。
他们假设一种head
实现将光标留在输入中紧邻其输出的列表字节之后。如果输入文件是可查找的(例如当input.yml
是常规的文件)。
如果您想在每次迭代时等待这 10000 行,您可以(在 GNU 系统上)使用以下命令来完成:
tail -fn+1 input.yml |
while true; do
sed -u 10000q > output.txt
sleep 60
done
这里,输入是不可查找的管道。因此我们需要head
一个可以一次读取一个字节直到第 10000 个换行符的实现。因此 GNUsed
就-u
可以做到这一点。
另一种方法是:
tail -fn+1 input.yml | awk -v out=output.txt -v n=10000 '
{print > out}
NR % n == 0 {close(out); system("sleep 60")}'
(如果您awk
是mawk
,则需要通过-W interactive
)。该命令不需要一次读取一个字节,因为它始终是读取输入的同一命令的相同调用。请注意,awk
每次运行该sleep 60
命令时都会执行一个 shell。