歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> awk i=!i 來輸出奇偶行詳解

awk i=!i 來輸出奇偶行詳解

日期:2017/2/27 16:04:16   编辑:Linux教程
seq 100 |awk 'i=!i'
awk 那段是怎麼理解?
首先我們要了解一下awk對於未定義的變量處理方法:
對於數值運算,未定義變量的話awk會賦予變量初值為0
對於字符運算,未定義變量的話awk會賦予變量初值為空字符串
了解了這兩條我們再看awk 'i=!i'這條命令是什麼含義,awk是對文本文件一行一行處理的,seq 100命令執行後是如下形式:
1
2
3
……
100

首相它讀取第一行數據,也就是1,然後進行模式匹配,i是一個未定義的變量,上面我們提到了對於數值運算,未定義變量的話初值會為0,這時i的值即為0,也就是i=!0,那麼!是什麼呢?!就是取反的意思,等號右邊其實就是個布爾值,0為假,1為真,這裡是!0,那麼它就為非假,也就是為真,真的值為1,因此i=!0(1)也就相當於i=1,到此i的值為1.

i的值為1後有什麼作用呢?
i=1說明值為真,awk會認定模式為真,這時匹配是成功的,會把第一行輸出到屏幕,可能有的人會問了這裡只有i=!i,沒有print,它怎麼輸出的?awk的格式為 模式{ 動作},如果只有模式沒有動作,那麼匹配成功後默認的會輸出整條記錄,也就是說這條命令完整的寫法為:
seq 1 100 | awk 'i=!i{print $0}'

為什麼第二行沒有輸出呢?
前面進行第一行模式匹配的時候i的值已經由0變為了1,在進行第二行操作的時候,i=!i變成了i=!1,這樣i的值就又變成了0(假),所以第二行沒有輸出,到了處理第三行的時候,i=!i變成了i=!0,所以會輸出第三行,以此類推……這樣我們就可以輸出奇數行而刪除偶數行了。

那麼如何輸出偶數行呢?
我們可以加一個if判斷一下,如果i的值為真我們就輸出奇數行,如果為假就輸出偶數行
[root@localhost ~]# seq 1 10 | awk '{i=!i;if(i) print $0}'
1
3
5
7
9

[root@localhost ~]# seq 1 10 | awk '{i=!i;if(!i) print $0}'
2
4
6
8
10

看到這兒又有朋友可能會問了,為什麼現在把i=!i放到動作裡了呢?
我們看這兩條命令:
[root@localhost ~]# seq 1 10 | awk 'i=!i{print !i}'
0
0
0
0
0
[root@localhost ~]# seq 1 10 | awk 'i=!i{print i}'
1
1
1
1
1

如果把i=!i放到模式裡邊它會進行匹配,把匹配的結果傳遞給動作,那個時候已經把不匹配的捨去了,所以我們無法用if來判斷i的值。
Copyright © Linux教程網 All Rights Reserved