【问题标题】:How can I empty a file using awk getline如何使用 awk getline 清空文件
【发布时间】:2012-08-07 12:53:54
【问题描述】:

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

脚本功能:

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

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

我怎样才能一次或循环删除文件的内容?

【问题讨论】:

    标签: linux shell scripting awk getline


    【解决方案1】:

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

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

    【讨论】:

    • 我的愿望其实是删除awk脚本里面的文件。所以不可能吗?
    • 没有。您需要运行单独的命令来清空脚本。正如其他答案所说,您可以使用 awk 清空它,但不能在运行时(这意味着您将无法在单个 awk 命令中读取和清空以及再次写入和读取)。
    • 好吧,我正在清空一个文件并从另一个文件中读取。在 awk 的一个循环步骤中,我可以进入小的 while 循环,在其中我清空另一个文件并再次继续主循环....不可能吗?
    • 我想如果您遵循@Kent 的回答是可能的。试一试。我不知道系统调用。
    【解决方案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&gt;a.txt")}'

    这个 system() 调用将启动另一个进程,在这种情况下是“cat”来清空文件。

    您也可以应用 awk 重定向,正如 Thor 在他的回答中显示的那样。

    但如果您在循环中执行 awk 重定向,请小心。每次执行printf("") &gt; 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("")&gt;fn}) 清空文件,但事实并非如此。

    【讨论】:

    • 我的 shell 是 korn shell。你能解释一下kent:/tmp$ awk '{system("&gt;a.txt")}'&lt;&lt;&lt;"foo"它的作用吗?
    • 你的意思是这样的:system("echo '' | awk '{ printf("") &gt; "file_to_delete" }' ") ?
    • @doniyor 不,您可以使用 system() 和 shell 命令。像猫一样。 awk '{system("cat /dev/null&gt;a.txt")}' 或者使用Thor的解决方案,但是在printf("")>"file"之后关闭文件。
    • 是的,为什么在您的示例中没有清空文件?
    【解决方案3】:

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

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

    编辑

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

    close("file_to_delete")
    printf("") > "file_to_delete"
    

    【讨论】:

    • 我又不在 awk 中,我需要在 awk 脚本中进行。
    • 单引号内的所有内容都由awk 执行。因此,在您的情况下使用:printf("") &gt; "file_to_delete" 其中“file_to_delete”是您要删除的文件的文件名,或保存文件名的变量。
    • @Thor 我没有看到 OP 的整个脚本。但如果它像他所说的那样,在一个循环中,截断文件,然后重新填充,然后再次截断。你的 printf("") > "filename" 会有问题。它只截断一次(第一次),我会在我的答案中举一个例子以获得更好的代码格式。
    猜你喜欢
    • 2020-11-12
    • 2019-02-20
    • 2011-06-22
    • 1970-01-01
    • 2013-02-28
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多