注文する

注文する

次のような強く打つこのコマンドは入力ファイルを読み取り、各行の間に15秒間隔を置いて各行を印刷します。

IFS=$'\n';for line in $(cat file.txt | tail -n +2); do echo $line && sleep 15; done;

ただし、各回線間の遅延時間が長いためこのコマンド実行中の入力ファイルの変更

たとえば、5行目を変更すると、コマンドは最初の3行だけを印刷できます。 30秒後にコマンドが5行目に達し、印刷時にコマンドが最初に実行されたときのファイルではなく、更新された行を表示したいと思います。


はい入力するファイル.txt

本土
アフリカ
南極
アジア
オーストラリア
ヨーロッパ北 アメリカ

アメリカ

入力ファイルに順序がありません。

修正済み入力するファイル.txt
アフリカ
南極大陸ヨーロッパ
アジア
オーストラリア
北 アメリカ

アメリカ

答え1

ファイルを実行するたびにファイルを読み取る必要があります。以下を試してください。

num=1
while true; do
if [[ $num < $(wc -l file.txt) ]]; then
    awk "NR==$num" file.txt && let "num++"
else
    break
fi
sleep 15
done

これにより、1行が印刷され、15秒間休止状態になり、続行され、行がない場合は終了します。 NRはawkレコード番号または行番号の組み込み変数です。

答え2

以下を使用してファイルに追加します(または編集するときは非常に注意してください)。

awk '{ system("echo "$0"; sleep 15") }' file.txt

注文する

あなたが持っている主な問題は、最初にファイルの読み取りを実行する方法です$(cat file.txt | tail -n +2)。つまり、ファイル全体を読み込み、ループが始まる前に繰り返す行のリストを生成します。この時点では、ファイルの読み取りが完了したときにファイルに何が起こるかは問題ではありません。その後、高価なコマンドを使用して行を繰り返すことができます。

代わりに、アプリケーションは一度に1行ずつ読み取って処理したいと思います。これを行うには、awkコマンドを使用できますsystem

awk '{ system("echo "$0"; sleep 15") }' file.txt

ここでは、awkを使用してファイルを開き、1行ずつ処理します。各行で"echo "$0"; sleep 15"シェルのコマンドを実行します。 sedを現在の行に置き換えるには、引用符が引用符の$0外側にある必要があります。それ以外の場合は、コマンドの一部と見なされます。

ファイルの変更

ただし、このコマンドが唯一の問題ではない可能性があります。この点で、ほとんどのアプリケーションはまったく新しいファイルに書き込み、「保存」をクリックすると古いファイルを削除し、新しいファイルの名前を変更するようにファイルを変更します。これは安全のためです。ファイルの書き込み中にクラッシュが発生しても、元のファイルはそのまま残るので問題はありません。ファイルが所定の位置に変更されたようです。これは、awk(または使用しているすべてのコマンド)が修正を読み始める前にファイルを閉じて再度開く必要があることを意味します。

残念ながら、ファイルを変更するほとんどのコマンドはこの方法で行われます。ただし、ファイルに安全に追加できます。

echo "Test" >> file.txt

他のすべての国が完了すると、上記のコマンドが処理を開始します。

実際、これらすべてにはその理由があり、単にあなたが望むことを行うことが可能であれば、可能な限り多くの競争条件と特別なケースを隠しています。まず、必要な行の前にファイルを変更するとどうなりますか?ファイルの場所は行番号ではなくバイト位置に追跡されるため、変更する行の長さが異なると、アプリケーションはファイル内のその場所を失います。また、アプリケーションがファイルを内部で変更できるとしても、変更されたバイトのみを更新するのではなく、実際にファイル全体を最初から書き直すことを考慮する必要があります(再度追加/移動する行によって異なる場合があります)。寸法はオリジナルです。)

または、毎回ファイルを読み取り、現在の行番号を追跡できます。これは上記の問題のいくつかを解決しますが、現在の行の前に行を追加するとどうなるかなど、考慮する必要があるいくつかの特別なケースがあります。処理中の行?単純な解決策では、現在の行を2回処理します。これは問題になる可能性があります。最善の方法は、ファイルを読み込み、ファイルが修正/削除された場合は再度読み込み、ファイルの変更を手動で処理して、違いを解決するアプリケーションを直接作成することです。ただし、これを行うにはより多くの作業が必要で、単に追加する必要があります。状況によっては、上記の方法のみが必要になる場合があります。

関連情報