我正在研究Debian Stable Linux,否则它运行得非常好。我在名为“myrev”的python脚本文件中有以下代码,它可以反转给定文本文件行的顺序:
require(data.table)
require(ggplot2)
wf <- data.table::fread('Date Gals Days GpD GpM
2016-10-21 6.0 1 6.0 186.0
2016-10-22 6.0 1 6.0 186.0
2016-10-23 12.4 1 12.4 384.4
2016-10-24 26.8 1 26.8 830.8
2016-10-25 33.3 1 33.3 1032.3
2016-10-26 28.3 1 28.3 877.3')
nmu <- mean(wf$Gals)
textmu <- paste("Mean:", round(nmu, 2))
nmed <- median(wf$Gals)
textmed <- paste("Median:", round(nmed, 2))
p <- ggplot(wf, aes(Date, Gals)) +
geom_line(aes(lty = "Gals", color = "Gals", group = 1)) +
geom_hline(aes(yintercept = nmu, linetype = textmu, color = textmu),
color='red',size=1)+
geom_hline(aes(yintercept = nmed, linetype = textmed, color = textmed),
color='orange',size=1)+
#scale_linetype('Water Usage') +
scale_color_manual('Water Usage',
values=c('Gals'='black',textmu='red', textmed='orange')) +
xlab("") +
ylab("Gallons per Day")
print(p)
如果我使用以下Linux命令
,它可以正常工作并打印出相反的行顺序#! /usr/bin/python3
import sys
if len(sys.argv) < 2:
print("Usage: myrev infile")
sys.exit()
try:
with open(sys.argv[1], "r") as f:
lines = f.read().split("\n")
except:
print("Unable to read infile.")
sys.exit()
lines.reverse()
print("\n".join(lines))
但是,如果我尝试使用以下命令将输出重定向到原始文件,则会生成一个空白文件:
./myrev infile
在上面的命令之后,infile变成一个空文件。
为什么我不能将输出重定向到原始文件以及如何解决这个问题?
答案 0 :(得分:0)
使用>
打开要写入的目标文件,就像通过fopen
以模式"w"
打开一样。在程序甚至启动之前,立即会截断文件(当shell在exec
程序之前配置环境时会发生这种情况)。您无法使用此方法从文件中读取数据并将其替换为单个步骤。你能做的最好的事情就是:
./myrev infile > infile.tmp && mv -f infile.tmp infile
其中,如果命令成功,则通过将原始文件替换为新文件的内容来完成工作。