繁体   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