2016-07-04 69 views
4

在修改awk中的特定字段後,輸出字段分隔符上的信息是否丟失,是否總是這樣?如果有多個字段分隔符並且我希望它們被恢復,會發生什麼?awk中輸出字段分隔符在字段中替換

例如,假設我有一個簡單的文件example包含:

a:e:i:o:u 

如果我只是運行一個awk腳本,它考慮了輸入分隔符,即打印每一行中我的文件,例如as running

awk -F: '{print $0}' example 

我會看到原始的行。但是,如果我直接修改其中一個字段,例如與

awk -F: '{$2=$2"!"; print $0}' example 

我不回去原線的改良版,而我看到的默認空白分離器分離的領域,即:

a e! i o u 

我能找回的修改版本通過指定OFS原,例如:

awk -F: 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example 

在這種情況下,然而,在存在多個潛在字段分隔符,但在多個分離的情況下是有簡單的方法恢復原始分隔符?

例如,如果example有兩個:;作爲分隔符,我可以用-F":|;"處理文件,但會OFS沒有足以恢復原來的隔板在它們的相對位置。

更明確地說,如果我們切換到含有

a:e;i:o;u 

我們可以使用

awk -F":|;" 'BEGIN {OFS=":"} {$2=$2"!"; print $0}' example2 

(或-F"[:;]"example2得到

a:e!:i:o:u 

,但我們已經失去了區別之間 ;這將一直保持下去,如果我們能恢復

a:e!;i:o;u 
+1

問題是這裏罕見的好問題之一。爲什麼不簡單地使用'-F'[:;]''來添加一個非工作示例。這會使問題變得完美 - imo – hek2mgl

+1

明確添加的示例 – borrible

+0

RT的字段分隔符相當於GNU擴展。我想知道他們爲什麼沒有它。 –

回答

3

您需要使用GNU AWK第四屆ARG分裂(),它保存了分隔符,就像RT確實爲RS:

$ awk -F'[:;]' '{split($0,f,FS,s); $2=$2"!"; r=s[0]; for (i=1;i<=NF;i++) r=r $i s[i]; $0=r} 1' file 
a:e!;i:o;u 

有沒有自動填充的FS匹配字符串數組,因爲在每次將記錄分割爲字段時,存儲與FS相匹配的字符串的時間和內存會有多大的花費。相反,GNU awk人們提供了第4個arg來分割(),所以你可以自己做,如果/當你想要的時候。這是幾年前在經驗豐富的awk用戶和gawk提供商之間的comp.lang.awk新聞組中進行的長時間對話的結果,因爲他們都同意這是最好的方法。

請參閱split()https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions