私は学んでおり、変更をファイルに保存するオプションを使用する場合awk
と同様に、変更をファイルに書き込むオプションがあるかどうかを知りたいです。sed
-i
リダイレクトを使用して変更を書き込むことができることは理解しています。しかし、それを行うオプションはありますawk
か?
GNU Awk 4.1.0 (2013 年リリース) 以降では、「インプレース」ファイル編集のオプションがあります。
[...] 新しい機能を使用して構築された「インプレース」拡張機能は、GNU "
sed -i
" 機能をシミュレートするために使用できます。[...]
使用例:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
バックアップを保持するには:
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3
GNU awk 4.1.0 以降を使用していない限り...
sed の-i
オプションのようなオプションはないため、代わりに次のようにします。
$ awk '{print $0}' file > tmp && mv tmp file
注:これ-i
は魔法ではありません。一時ファイルを作成してsed
処理するだけです。
GNU awk 4.1.0 以降...
GNU awk
バージョン 4.1.0 (2013 年 10 月 5 日リリース)でこの機能を追加しました。-i
リリースされたノートで説明されているように、オプションを指定するだけでは簡単ではありません。
新しい -i オプション (xgawk から) は、awk ライブラリ ファイルをロードするために使用されます。これは、最初の非オプション引数がスクリプトとして扱われるという点で -f とは異なります。
次のように、バンドルされたinplace.awk
インクルード ファイルを使用して拡張機能を適切に呼び出す必要があります。
$ cat file
123 abc
456 def
789 hij
$ gawk -i inplace '{print $1}' file
$ cat file
123
456
789
変数INPLACE_SUFFIX
を使用して、バックアップ ファイルの拡張子を指定できます。
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file
$ cat file
123
456
789
$ cat file.bak
123 abc
456 def
789 hij
-i inplace
この機能が追加されたことをうれしく思いますが、私にとっては、言語の簡潔さに力があり、 8 文字が長すぎるため、実装はそれほど厄介ではありません。
公式ワードのマニュアルへのリンクはこちら。
動作するほんの少しのハック
echo "$(awk '{awk code}' file)" > file
これは機能しません:
someprocess < file > file
シェルは、制御を someprocess に渡す前にリダイレクトを実行します ( redirections )。>
リダイレクトにより、ファイルがゼロ サイズに切り捨てられます (出力のリダイレクト)。したがって、一部のプロセスが起動されてファイルからの読み取りが必要になるまでには、読み取るデータがありません。
以下は動作しません
echo $(awk '{awk code}' file) > file
これはうまくいくはずです
echo "$(awk '{awk code}' file)" > file
一時ファイルを作成せず、version!=(gawk 4.1.0) で使用可能な awk のみのソリューションが必要な場合:
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file