将python脚本的输出重定向到文件的BEGINNING

时间:2014-08-30 12:38:02

标签: python bash awk sed sh

我知道将输出附加到文件的以下选项:

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

但似乎没有工作。

2 个答案:

答案 0 :(得分:1)

一种简单的方法是使用单独的临时文件:

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脚本的输出)。输出将添加到缓冲区anext表示awk跳过其余命令并转到下一行。

1是一种速记,可以打印文件中的所有行。当包含&#34;级别的行:&#34;找到,缓冲区a的每一行也被打印出来。

您可以使用与上面相同的技巧将输出写入临时文件,然后覆盖原始文件。

答案 1 :(得分:0)

这应该这样做:

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决定何时覆盖文件,它唯一的问题是内存使用和速度如果原始档案很大。