如何使用awk getline清空文件

时间:2012-08-10 08:28:07

标签: linux shell scripting awk getline

如何使用getline删除文件内容。该文件应该在每个第9个循环和旧内容中刷新,直到最后的第9个循环然后它应该被删除,以便可以再次写入和检索新内容..

脚本功能:

     function leeren(tmpdatei){
      while(getline line < tmpdatei){
         line=""
      }
     }

这个应该删除文件内容的功能。每9个循环调用该函数。在逻辑上它在这个意义上是可以的,但删除内容不起作用,我想,用getline删除文件的内容不是正确的方法,对吧?

如何一次或循环删除文件内容?

3 个答案:

答案 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} })并在该文件上多次调用它们。