如何使用getline
删除文件内容。该文件应该在每个第9个循环和旧内容中刷新,直到最后的第9个循环然后它应该被删除,以便可以再次写入和检索新内容..
脚本功能:
function leeren(tmpdatei){
while(getline line < tmpdatei){
line=""
}
}
这个应该删除文件内容的功能。每9个循环调用该函数。在逻辑上它在这个意义上是可以的,但删除内容不起作用,我想,用getline
删除文件的内容不是正确的方法,对吧?
如何一次或循环删除文件内容?
答案 0 :(得分:2)
如果你的shell是bash,并且你真的想在awk中清空文件:请参阅下面的测试:
kent:/tmp$ seq 3 > a.txt
kent:/tmp$ cat a.txt
1
2
3
kent:/tmp$ awk '{system(">a.txt")}'<<<"foo"
kent:/tmp$ cat a.txt
kent:/tmp$
修改强>
你可以改为awk '{system("cat /dev/null>a.txt")}'
这个system()调用将启动另一个进程,在这种情况下是&#34; cat&#34;清空文件。
你也可以应用awk重定向,正如Thor在他的回答中所示。
但如果你在循环中执行它,请使用awk重定向。你应该在每次printf("") > filename.
时关闭文件,否则它会在第一次截断后将所有内容附加到文件中。见下面的例子:
kent$ cat a.txt
1
2
3
kent$ awk 'BEGIN{fn="a.txt"}{
printf ("") > fn;
printf("refilled")>fn;
printf("")>fn;
printf("refilled again")>fn;
printf("")>fn}'<<<"foo"
kent$ cat a.txt
refilledrefilled again
如你所见,你会期望awk(printf("")>fn}
)中的最后一行清空文件,但它没有。
答案 1 :(得分:2)
要从awk
中删除文件,您可以使用重定向:
echo '' | awk '{ printf("") > "file_to_delete" }'
正如Kent所说,该文件需要关闭以使其正常工作。以下修改应该足够了:
close("file_to_delete")
printf("") > "file_to_delete"
答案 2 :(得分:0)
据我所知,除非你解析每一行并将其删除(因为awk逐行读取文件),否则你只能使用awk清空一个文件。
我不知道你想要实现什么,但对我来说,最好的方法是创建一个bash脚本,其中你有一个运行awk脚本的函数和另一个清空文件的函数(可能使用{{1} })并在该文件上多次调用它们。