簡體   English   中英

將python腳本的輸出重定向到文件的開始

[英]Redirect the output of a python script to THE BEGINNING of a file

我知道以下將輸出附加到文件的選項:

test.py:

print "Error"
print "Warning"

的test.txt:

Levels:
Debug

當我做:

python test.py > test.txt

它附加在文件末尾。

但是,如果我想在文件的開頭追加內容,則文件的輸出如下所示:

Levels:
Error
Warning
Debug

是否有任何簡單的方法可以執行此操作而無需手動創建臨時文件(例如sed -i是可以的)。

我嘗試了幾種sed方法:

sed -i '1i\`python test.py`' test.txt

但是似乎沒有一個工作。

一種簡單的方法是使用單獨的臨時文件:

python test.py | cat - test.txt > tmp && mv tmp test.txt

-表示cat使用標准輸入。


我只是意識到您實際上是想將文本放在第一行之后,而不是放在開頭。 為此,您可以使用awk:

python test.py | awk 'NR==FNR{a[++n]=$0;next}1;/Levels:/{for(i=1;i<=n;++i)print a[i]}' - test.txt

NR是總記錄(行)號, FNR是當前輸入的記錄號。 NR==FNR表示第一個塊僅在第一個輸入上操作(在這種情況下,這是python腳本的輸出)。 輸出將添加到緩沖區a next意味着awk跳過其余命令並轉到下一行。

1是使文件中所有行都被打印的簡寫。 當找到包含“ Levels:”的行時,緩沖區a每一行也會被打印。

您可以使用與上述相同的技巧將輸出寫入臨時文件,然后覆蓋原始文件。

應該這樣做:

python test.py |
awk '
    NR==FNR { a[NR] = $0; next }
    { print (FNR==1 ? a[1] RS : "") $0 }
    END { for (i=2;i in a;i++) print a[i] > ARGV[1] }
' test.txt -

上面的代碼將第一個文件讀入數組,然后在打開來自管道的stdin流之前關閉該文件,因此從那時起,它可以安全地覆蓋數組中原始內容與管道輸入合並后的第一個文件訂購你喜歡的。

awk '...' file > file ,這是完全安全的,因為它是awk而不是shell決定何時覆蓋文件,如果原始文件很大,唯一的問題就是內存使用率和速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM