一、三元運(yùn)算符
- 還記的之前學(xué)習(xí)編程語(yǔ)言時(shí)的 " if ... else ... " 結(jié)構(gòu)嗎?其實(shí)我們使用三元運(yùn)算符就可以代替其功能。
- 三元運(yùn)算符的形式1:[ 結(jié)果 = 條件 ? 結(jié)果1:結(jié)果2 ]
- 三元運(yùn)算符的形式2:[ 條件 ? 表達(dá)式1 : 表達(dá)式2 ]
- 代碼示例,如下:
(1) if ... else ... 形式
etl@bejedw09:/home/etl/cya> cat file
student1 98
student2 89
student3 93
student4 78
student5 91
student6 96
etl@bejedw09:/home/etl/cya> awk '{if($2>=90){print $1,"perfect"} \
else { print $1,"come on !!!" } }' file
student1 perfect
student2 come on !!!
student1 perfect
student2 come on !!!
student1 perfect
student1 perfect
(2)三元運(yùn)算符示例1
etl@bejedw09:/home/etl/cya> awk '{type=$2>=90? "perfect":"come on !!!";\
print $1 , type}' file
student1 perfect
student2 come on !!!
student1 perfect
student2 come on !!!
student1 perfect
student1 perfect
(3)三元運(yùn)算符示例2
etl@bejedw09:/home/etl/cya> awk '{$2=90? a++:b++ } END{print a , b}' file
4 2
#可以使用三元運(yùn)算符統(tǒng)計(jì)個(gè)數(shù),成績(jī)大于等于90分的學(xué)生有4個(gè),小于90的也有2個(gè)
二、打印奇偶行
在 Linux 環(huán)境中如果想要打印文件的奇偶行,方法實(shí)在是太多了,先來(lái)看 awk 是如何實(shí)現(xiàn)的
etl@bejedw09:/home/etl/cya> awk 'NR%2==0{print $0}' file
student2 89
student4 78
student6 96
etl@bejedw09:/home/etl/cya> awk 'NR%2!=0{print $0}' file
student1 98
student3 93
student5 91
#awk打印文件的奇偶行
再來(lái)看看 sed 又是如何實(shí)現(xiàn)的
etl@bejedw09:/home/etl/cya> sed -n '2~2p' file
student2 89
student4 78
student6 96
etl@bejedw09:/home/etl/cya> sed -n '1~2p' file
student1 98
student3 93
student5 91
#sed打印文件的奇偶行
上面的兩種 awk 和 sed 打印文件奇偶行的方式已經(jīng)是非常經(jīng)典的了,這里再用 awk 的另外一種方式實(shí)現(xiàn)打印文件奇偶行
etl@bejedw09:/home/etl/cya> awk 'i=!i' file
student1 98
student3 93
student5 91
etl@bejedw09:/home/etl/cya> awk '!(i=!i)' file
student2 89
student4 78
student6 96
#上面這兩條命令是如何實(shí)現(xiàn)打印文件奇偶行的哪?看下面的文字解釋和代碼示例就曉得了^_^
#提示1:在 awk 中,如果省略了模式對(duì)應(yīng)的動(dòng)作,當(dāng)前行滿足模式時(shí),默認(rèn)打印整行,即
# { print $0 };
代碼示例1:
etl@bejedw09:/home/etl/cya> awk '1' file
student1 98
student2 89
student3 93
student4 78
student5 91
student6 96
etl@bejedw09:/home/etl/cya> awk '0' file
etl@bejedw09:/home/etl/cya>
#提示2:當(dāng) awk 開始處理第一行時(shí),變量 i 被初始化,變量 i 在被初始化時(shí)值為 "空",
# 在 awk 中,數(shù)字0或者 "空字符串"表示 "假",非0或非空字符串表示"真" 所以
# 可以認(rèn)定上述模式為假,那就是模式不成立所以不需要執(zhí)行對(duì)應(yīng)的動(dòng)作,但是i直接取
# 反了,對(duì)假取反就是真,將取反后的值又賦值給了變量i,所以此刻執(zhí)行print {$0}
# 看下面的命令,我們可以追蹤變量 i 的值,再根據(jù) "代碼示例1" ,屏幕前這么cute、
# 這么clever的讀者一定明明白白的了吧
代碼示例2:
etl@bejedw09:/home/etl/cya> awk '{ i=!i; print i }' file
1
0
1
0
1
0
- 結(jié)尾
本文就打印文件奇偶行的問(wèn)題花費(fèi)的筆墨最多,而且介紹了三種方法來(lái)實(shí)現(xiàn),要知道實(shí)際開發(fā)中打印文件奇偶行并不常見(jiàn),至少我工作到現(xiàn)在,幾乎每天都要處理文本,還沒(méi)有碰到過(guò)打印文件奇偶行的需求,那么我們?yōu)槭裁催€要學(xué)習(xí)哪?我也想過(guò)這個(gè)問(wèn)題,上過(guò)高中的同學(xué)都有過(guò)這么的經(jīng)歷,最后高考的題都有固定的題型,我們?cè)谄綍r(shí)的學(xué)習(xí)中做練習(xí)冊(cè)的時(shí)候會(huì)發(fā)現(xiàn)有些題型怪怪的,根本不符合高考的出題規(guī)范,那么這類題的意義是什么哪?高中數(shù)學(xué)老師的解釋是:“這類題型高考不會(huì)出,可是這類題你們也要做,因?yàn)檫@可以讓你們更好的理解這個(gè)知識(shí)點(diǎn)”,同樣的,在這里它就可以幫我們更好的理解 awk 這個(gè)命令,如果你把第三種打印文件奇偶行的方式搞的很明白的話,你就會(huì)發(fā)現(xiàn),你更加了解 awk 包括它的一些默認(rèn)處理,你和 awk 的距離就拉近了,以后遇到文本格式化問(wèn)題使用 awk 就會(huì)變得得心應(yīng)手^_^