1. 程式人生 > 實用技巧 >二,awk分隔符

二,awk分隔符

  在前一篇文章中我們略微提到過"分隔符",但是並沒有細說,那麼我們今天就聊聊什麼是分隔符,awk有哪些分隔符,awk的預設分割符是空格,但是,這樣描述並不精確,因為,awk的分隔符還分為兩種,"輸入分隔符" 和 "輸出分隔符" 。

  此處我們先將分隔符的概念列出,看不懂沒關係,我們會一一進行舉例,到時自然會明白。

  輸入分隔符,英文原文為field separator,此處簡稱為FS

  輸入分割符,預設是空白字元(即空格),awk預設以空白字元為分隔符對每一行進行分割。

  輸出分割符,英文原文為output field separator,此處簡稱為OFS

  awk將每行分割後,輸出在螢幕上的時候,以什麼字元作為分隔符,awk預設的輸出分割符也是空格。

  光看概念是不是不容易搞明白?沒關係,我們來動手實踐一下,勝過千言萬語。

  

  輸入分隔符

  我們現在通過一些小例子,搞明白這兩個分隔符的作用,不過我們要一個一個來,我們先看一些"輸入分隔符"的小例子

  輸入分隔符比較容易理解,當awk逐行處理文字的時候,以輸入分隔符為準,將文字切成多個片段,預設使用空格,但是,如果一段文字中沒有空格,我們可以指定以特定的文字或符號作為輸入分割符,比如下圖中的例子,我們指定使用"#"作為輸入分隔符。

[root@node1 ~]# cat test
abc#123#iuy#ddd
8ua#456#auv#ppp#7y7
[root@node1 ~]# awk -F# '{print $1,$2}' test
abc 123
8ua 456

  上圖中,我們使用了-F 選項,指定了使用#號作為輸入分隔符,於是,awk將每一行都通過#號為我們分割了。

  除了使用 -F 選項指定輸入分隔符,還能夠通過設定內部變數的方式,指定awk的輸入分隔符,awk內建變數FS可以用於指定輸入分隔符,但是在使用變數時,需要使用-v選項,用於指定對應的變數,比如 -v FS='#',如下圖

[root@node1 ~]# awk -v FS='#' '{print $1,$2}' test
abc 123
8ua 456

  其實不管是通過-F選項,還是通過FS這個內建變數,目的都是設定指定的輸入分隔符,達到的效果是相同的,我們會在另一篇文章中單獨對awk的變數進行總結,如果你不理解這些變數,沒有關係,後面自然會明白。

  而此處,我們使用了awk中的一個選項,就是-F,還記得我們之前總結的awk的使用語法嗎。

  我們說過,awk的語法如下

  awk [options] 'Pattern{Action}' file

  而-F,就是options的一種,用於指定輸入分隔符。

  -v也是options的一種,用於設定變數的值。

  再結合之前的文章,我們已經將options 、pattern 、action都簡單的應用了一遍,好了,我們已經"會用"awk了。

  

  輸出分隔符

  那麼什麼是輸出分隔符呢?聰明的你應該已經發現了,當awk為我們輸出每一列的時候,會使用空格隔開每一列,其實,這個空格,就是awk的預設的輸出分隔符,下圖中紅線標註的空格部分,就是awk的預設的輸出分隔符。

  輸出分割符的意思就是:當我們要對處理完的文字進行輸出的時候,以什麼文字或符號作為分隔符。

  我們可以使用awk的內建變數OFS來設定awk的輸出分隔符,當然,使用變數的時候要配合使用-v選項,示例如下

[root@node1 ~]# cat test1
abc 123 iuy ddd
8ua 456 auv ppp 7y7
[root@node1 ~]# awk -v OFS="+++" '{print $1,$2}' test1
abc+++123
8ua+++456

  現在,我們可以同時指定輸入分隔符和輸出分割符了,示例如下

[root@node1 ~]# cat test
abc#123#iuy#ddd
8ua#456#auv#ppp#7y7
[root@node1 ~]# awk -v FS='#' -v OFS='---' '{print $1,$2}' test
abc---123
8ua---456

  我們剛才解釋了awk的輸出分隔符,如果,在輸出的時候,我們想要讓兩列合併在一起顯示,不使用輸出分隔符分開顯示,該怎麼做呢?如下圖所示,藍線之上使用預設的輸出分隔符進行了分隔,而藍線之下的兩種方法均未使用輸出分隔符進行分隔,而是將兩列合在一起顯示了。

[root@node1 ~]# cat test1
abc 123 iuy ddd
8ua 456 auv ppp 7y7
[root@node1 ~]# awk  '{print $1 $2}' test1
abc123
8ua456
[root@node1 ~]# awk  '{print $1$2}' test1
abc123
8ua456

  細心如你一定發現了,上圖中的示例在語法上的區別就是,一個有"逗號",一個沒有"逗號"。

  awk '{print $1 $2}' 表示每行分割後,將第一列(第一個欄位)和第二列(第二個欄位)連線在一起輸出。

  awk '{print $1,$2}' 表示每行分割後,將第一列(第一個欄位)和第二列(第二個欄位)以輸出分隔符隔開後顯示。