私は学習していてawk
、変更をファイルに保存sed
する-i
オプションを使用する場合と同様に、変更をファイルに書き込むオプションがあるかどうかを知りたいです。
リダイレクトを使用して変更を書き込むことができることは理解しています。しかし、それawk
を行うためのオプションはありますか?
私は学習していてawk
、変更をファイルに保存sed
する-i
オプションを使用する場合と同様に、変更をファイルに書き込むオプションがあるかどうかを知りたいです。
リダイレクトを使用して変更を書き込むことができることは理解しています。しかし、それawk
を行うためのオプションはありますか?
回答:
最新のGNU Awk(4.1.0リリース以降)では、ファイルを「インプレース」編集するオプションがあります。
[...]新しい機能を使用して構築された「インプレース」拡張は、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
inplace
は実際にはiiSeymourの回答gawk
に従って含まれているライブラリなので、として含めることができるものです。inplace
includefile
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
私はこの機能が追加されましたうれしいですが、電源は、言語の簡潔さから来て、と私には、実装は非常にawkishではありません-i inplace
あまりにも長い8つの文字である芋。
公式単語の取扱説明書へのリンクです。
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
?
awk '{print $0}' file | sponge file
使用sponge
して短いリテmoreutils
。
これは機能しません:
someprocess < file > file
シェルはリダイレクトを実行してから、制御をsomeprocess(redirections)に渡します。リダイレクトはゼロサイズ(にファイルを切り捨てられますリダイレクト出力)。したがって、何らかのプロセスが起動されてファイルからの読み取りを希望するときまでに、読み取るデータがありません。>
代わりの方法はsponge
次のとおりです。
awk '{print $0}' your_file | sponge your_file
'{print $0}'
awkスクリプトとyour_file
、その場で編集するファイルの名前で置き換えます。
sponge
入力を完全に吸収してから、ファイルに保存します。
sponge
の一部ですmoreutils
。そのため、ほとんどのシステムではデフォルトでは存在しません。しかし、少なくともsponge
それ自体は十分に移植可能で、ほとんどどこでも実行できるように見えます。
tee
ベースのソリューションと比較したこのソリューションの欠点は、sponge
書き出す前にすべてをRAMに読み込むため、大きなファイルでフリーズすることです。
フォローできません
echo $(awk '{awk code}' file) > file
これはうまくいくはずです
echo "$(awk '{awk code}' file)" > file
一時ファイルを作成せずにversionで使用できるawkのみのソリューションが必要な場合==(gawk 4.1.0):
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
awk '{awk code}' file | tee file
tee
コマンドテイク場所と後に実行されるawk
コマンドが原因に仕上がっています|
。