如何每 60 秒从文件中复制行,并从上次复制的位置继续

如何每 60 秒从文件中复制行,并从上次复制的位置继续

我需要每 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")}'

(如果您awkmawk,则需要通过-W interactive)。该命令不需要一次读取一个字节,因为它始终是读取输入的同一命令的相同调用。请注意,awk每次运行该sleep 60命令时都会执行一个 shell。

相关内容