GNU awk
(Linux システムでよく見られる) バージョン 4.1.0 以降、"awk
ソースライブラリ" -i
または --include
コマンドラインで。 GNU awk
で配布されているソース ライブラリの 1 つ inplace
と呼ばれるものです :
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
ご覧のとおり、これにより awk
の出力が作成されます コードは入力ファイルを置き換えます。 there
という行 プログラムによって出力されないため、保持されません。
awk
で ファイル内のスクリプト、次のように使用します
awk -i inplace -f script.awk datafile
awk
の場合 変数 INPLACE_SUFFIX
が文字列に設定されている場合、ライブラリはそれをファイル名サフィックスとして元のファイルのバックアップを作成します。
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
複数の入力ファイルがある場合は、各ファイルを個別にインプレース編集します。ただし、inplace=0
を使用して、ファイル (または一連のファイル) のインプレース編集をオフにすることができます。 そのファイルの前のコマンドラインで:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
上記のコマンドでは、 file3
その場で編集されません。
単一ファイルの移植性の高い「インプレース編集」を使用するには、
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
これにより、入力ファイルが一時的な場所にコピーされ、awk
が適用されます。 元のファイル名にリダイレクトしながら、一時ファイルのコード。
この順序で操作を実行します ( awk
を実行します) 元のファイルではなく、一時ファイルに) を追加すると、元のファイルのファイル メタデータ (アクセス許可と所有権) が変更されないことが保証されます。
これを試してください。
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- 出力を一時ファイルにリダイレクトします。
- 次に、一時ファイルの内容を元のファイルに移動します。