1

を使用してファイルのコンテンツを削除するにはどうすればよいですかgetline。ファイルは9番目のループごとに更新され、最後の9番目のループまで古いコンテンツが更新されてから削除され、新しいコンテンツを再度書き込んだり取得したりできるようになります。

スクリプト関数:

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

これは、ファイルの内容を削除することになっている関数です。この関数は、9番目のループごとに呼び出されます。論理的にはこの意味では問題ありませんが、コンテンツの削除は機能していません。ファイルのコンテンツを削除するのgetlineは正しい方法ではないでしょう。

次に、ファイルのコンテンツを一度にまたはループで削除するにはどうすればよいですか?

4

3 に答える 3

2

シェルが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」です。

Thorが答えに示しているように、awkリダイレクトを適用することもできます。

ただし、ループで行う場合は、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

printf("")>fn}ご覧のとおり、awk( )の最後の行でファイルが空になると予想されますが、そうではありませんでした。

于 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はファイルを1行ずつ読み取るため)。

何を達成したいのかわかりませんが、私にとって最善の方法は、awkスクリプトを実行する関数と、ファイルを空にする(おそらくを使用してsed)別の関数を使用してそれらを何度も呼び出すbashスクリプトを作成することです。そのファイルで必要に応じて。

于 2012-08-10T08:37:34.793 に答える