我有一個檔案,其資料/輸出如下所示:
7044 5.2 2:10 7856 4.7 0:27 10819 3.9 0:23 7176 3.3 0:25 7903 2.9 0:30 10850
我正在嘗試在暫停 1 秒后逐步列印此檔案.... 但 bash 一次列印整個檔案。
從這個答案我添加了一行來改變 IFS,這個命令給出:
IFS=$' ';for f in "$( cat output.txt )" ; do echo $f;sleep 1;done;
給
另請注意,這awk '{ print $1,$2,$3 }' output.txt
可以按需要作業,但for
回圈中的命令不能按需要逐步迭代。
for 回圈無法按預期作業的另一個示例:
awk '{ print $2 }' output.txt | tail -n2 | head -n1
<---這有效
for i in "$( cat output.txt | wc -l )";do awk '{ print $2 }' output.txt | tail -n$i | head -n1; sleep 1; done
<---這不能按預期作業。
uj5u.com熱心網友回復:
基本上,在尋找解決方案之前找到并理解真正的問題很重要。您的問題歸結為您想要獲得定期的、無緩沖的 shell 資料列印輸出。
Shell 緩沖發送到 STDOUT 的資料,因此資料回圈的作業方式與您的直覺所暗示的略有不同,并且可能會令人困惑。資料會被收集在緩沖區中,直到它滿或程式退出,然后才會有資料重繪 。因此,如果資料塊更大或接近資料緩沖區的大小,您可能會得到錯誤的印象,認為您正在“無緩沖”地進行操作。當您將資料重定向到檔案時,shell 以不同的方式作業,這可能會更加令人困惑。請注意,stderr 沒有被快取。
為了更好地理解,請閱讀這篇文章stackoverflow.com/a/13933741/282728
我們知道問題出在哪里。如何解決?
解決方案 1.最簡單的代碼永遠是最好的,我們只需要依次處理資料線并將每條線延遲1s發送到STDOUT。AWK 非常適合此類任務。
awk '{print $2; system("sleep 1");}' input.txt
為了方便參考,我把你的檔案名從 output.txt 改為 input.txt
解決方案2. GAWK 的GNU 版本也允許您使用fflush() 來重繪 緩沖區。如果您的 gawk 版本為 5.1 或更低,您還可以使用“time”擴展名后跟 gawk sleep() 函式,而不是創建子外殼和系統睡眠。
gawk '@load "time"; { print $2; fflush(); sleep(1); }' input.txt
要考慮:
一種。如果問題更復雜,并且您沒有在管道中使用 dd、cat 和 tee,也許您應該對 GNU coreutils 包中的 stdbuf 感興趣 https://www.gnu.org/software/coreutils/manual/html_node /stdbuf-invocation.html
stdbuf -oL [nohup] yourscript
-o switches to stdout
-L turn on line buffering
可選的 nohup 可以防止腳本在遠程連接丟失等情況下終止,如果任務需要很長時間,這會很有用。
灣 如果要定期將資料傳輸到結果檔案中,則可以考慮使用腳本程式:
[nohup] script -q -c yourprogram -f output.txt
-q mute script, block messages like "done" from being sent to stdout
-c starts the program instead of the interactive shell
C。或者撰寫一個小的 C 程式來重繪 緩沖區。這只是一個簡單的緩沖區欠載演示,并不是一個完整的解決方案!
int x=0;
while(x<10) {
printf("%d",x);
fflush(stdout);
sleep(1);
x ;
}
在 stdlib (stdio.h) https://en.cppreference.com/w/c/io/fflush 中看到flush sleep 屬于POSIX 標準,不是C99,因此需要使用unistd.h 庫 https:// pubs.opengroup.org/onlinepubs/007908799/xsh/sleep.html
d. 其他編程語言自然也有類似的緩沖區重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368467.html
上一篇:R使用自定義比較功能排序或排序