1

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

脚本功能:

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

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

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

4

3 回答 3

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() 调用将启动另一个进程,在这种情况下是“cat”来清空文件。

您也可以应用 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}) 中的最后一行清空文件,但事实并非如此。

于 2012-08-10T08:55:59.060 回答
2

要从内部删除文件,awk您可以使用重定向:

echo '' | awk '{ printf("") > "file_to_delete" }'

编辑

正如 Kent 所指出的,需要关闭文件才能使其正常工作。以下修改应该足够了:

close("file_to_delete")
printf("") > "file_to_delete"
于 2012-08-10T09:04:20.413 回答
0

据我所知,您无法仅使用 awk 清空文件,除非您解析每一行并将其删除(因为 awk 逐行读取文件)。

我不知道您想要实现什么,但对我来说,最好的方法是创建一个 bash 脚本,其中您有一个运行 awk 脚本的函数和另一个清空文件(使用可能sed)并多次调用它们的函数如您所愿在该文件上。

于 2012-08-10T08:37:34.793 回答