2013-05-13 152 views
79

我在學習awk,我想知道是否有一個選項可以將更改寫入文件,類似於sed,我將使用-i選項將修改保存到文件。awk保存修改到位

我明白我可以使用重定向來編寫更改。但是有沒有在awk這樣做的選項?

+0

另請參閱http://serverfault.com/a/547331/313521,以獲得「通過重定向編輯文件」的更一般答案。 – Wildcard 2015-11-04 03:29:34

回答

68

在最新的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 
+1

@sudo_O - 感謝「就地」演示。 Upvoted你的答案! – lind 2013-05-14 19:03:57

+0

看起來選項可能已被刪除?對於4.1.3,我有「-i includefile \t \t --include = includefile」 – 2016-06-18 11:46:31

+0

@Keith我有同樣的問題。我只是試了一下,它在我的4.1.3上運行。根據[iiSeymour的回答](http://stackoverflow.com/a/16529730/2877364),'inplace'實際上是一個包含'gawk'的庫,所以'inplace'是可以作爲includefile包含的東西。 – cxw 2016-06-23 20:16:32

84

除非你有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的官方詞彙。

11

@sudo_O有權利answer

這不能工作:

someprocess <file> file 

前殼切換控制權交給someprocess(redirections)執行重定向>重定向將截斷文件爲零大小(redirecting output)。因此,當某個進程啓動並想從文件中讀取時,就沒有數據可供讀取。

2

如果你想要一個只有AWK-解決方案,而創建一個臨時文件和能與版本!=(gawk 4.1.0):

awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file 
+0

但是,這是否緩衝整個文件到內存?考慮一個20GB的文件。 – 2016-11-29 23:52:30

5

只是一個小工程

echo "$(awk '{awk code}' file)" > file 
+5

將無法​​使用:換行符。 – Lloeki 2016-01-14 13:48:05

+1

@Lloeki謝謝,我已經修復了答案:) – 2016-09-05 06:56:55

3

下將無法正常工作

echo $(awk '{awk code}' file) > file 

這應該工作

echo "$(awk '{awk code}' file)" > file 
3

另一種方法是使用sponge

awk '{print $0}' your_file | sponge your_file 

當您更換'{print $0}' r awk腳本和your_file按您想要編輯的文件的名稱。

sponge在將其保存到文件之前完全吸收輸入。

0

使用三通

awk '{awk code}' file | tee file 

tee命令發生和awk命令完成由於|之後執行。