回答
在最新的GNU awk中(因爲4.1.0 released),它具有"inplace" file editing的選項:
[...]的 「就地」 擴展名,使用新設施建成,可以用來模擬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
@sudo_O - 感謝「就地」演示。 Upvoted你的答案! – lind 2013-05-14 19:03:57
看起來選項可能已被刪除?對於4.1.3,我有「-i includefile \t \t --include = includefile」 – 2016-06-18 11:46:31
@Keith我有同樣的問題。我只是試了一下,它在我的4.1.3上運行。根據[iiSeymour的回答](http://stackoverflow.com/a/16529730/2877364),'inplace'實際上是一個包含'gawk'的庫,所以'inplace'是可以作爲includefile包含的東西。 – cxw 2016-06-23 20:16:32
除非你有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
選項,在發佈的說明中介紹:
(從xgawk)新-i選項用於裝載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 c漢字長I.M.O。
這是一個鏈接到manual的官方詞彙。
這不能工作:
someprocess <file> file
前殼切換控制權交給someprocess(redirections)執行重定向。 >
重定向將截斷文件爲零大小(redirecting output)。因此,當某個進程啓動並想從文件中讀取時,就沒有數據可供讀取。
如果你想要一個只有AWK-解決方案,而創建一個臨時文件和能與版本!=(gawk 4.1.0):
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
但是,這是否緩衝整個文件到內存?考慮一個20GB的文件。 – 2016-11-29 23:52:30
只是一個小工程
echo "$(awk '{awk code}' file)" > file
將無法使用:換行符。 – Lloeki 2016-01-14 13:48:05
@Lloeki謝謝,我已經修復了答案:) – 2016-09-05 06:56:55
下將無法正常工作
echo $(awk '{awk code}' file) > file
這應該工作
echo "$(awk '{awk code}' file)" > file
另一種方法是使用sponge
:
awk '{print $0}' your_file | sponge your_file
當您更換'{print $0}'
r awk腳本和your_file
按您想要編輯的文件的名稱。
sponge
在將其保存到文件之前完全吸收輸入。
使用三通
awk '{awk code}' file | tee file
的tee
命令發生和awk
命令完成由於|
之後執行。
另請參閱http://serverfault.com/a/547331/313521,以獲得「通過重定向編輯文件」的更一般答案。 – Wildcard 2015-11-04 03:29:34