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秒ごとに10,000行。行が多い場合は、10000行になるまで待ちません。

head出力のリストバイトの直後に入力にカーソルを置く実装を想定します。入力ファイルを検索できる場合(例input.yml定期的な文書)。

各反復でこれらの10000行を待つには、次のように(GNUシステムで)実行できます。

tail -fn+1 input.yml |
  while true; do
    sed -u 10000q > output.txt
    sleep 60
  done

ここで、入力は検索不可能なパイプです。したがって、最大10000行目の改行文字headまで一度に1バイトを読み取ることができる実装が必要です。だからGNUはこれを行うことができます。sed-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。)このコマンドは、入力を読み取るのと同じコマンドに対して常に同じ呼び出しであるため、一度に1バイトを読み取る必要はありません。awkこのコマンドを実行するたびにsleep 60シェルが実行されることに注意してください。

関連情報