一萄唇、三元運算符
- 還記的之前學(xué)習(xí)編程語言時的 " if ... else ... " 結(jié)構(gòu)嗎?其實我們使用三元運算符就可以代替其功能串塑。
- 三元運算符的形式1:[ 結(jié)果 = 條件 ? 結(jié)果1:結(jié)果2 ]
- 三元運算符的形式2:[ 條件 舰讹? 表達式1 : 表達式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)三元運算符示例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)三元運算符示例2
etl@bejedw09:/home/etl/cya> awk '{$2=90? a++:b++ } END{print a , b}' file
4 2
#可以使用三元運算符統(tǒng)計個數(shù)狸相,成績大于等于90分的學(xué)生有4個薛匪,小于90的也有2個
二、打印奇偶行
在 Linux 環(huán)境中如果想要打印文件的奇偶行脓鹃,方法實在是太多了逸尖,先來看 awk 是如何實現(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打印文件的奇偶行
再來看看 sed 又是如何實現(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 的另外一種方式實現(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
#上面這兩條命令是如何實現(xiàn)打印文件奇偶行的哪瘸右?看下面的文字解釋和代碼示例就曉得了^_^
#提示1:在 awk 中娇跟,如果省略了模式對應(yīng)的動作,當(dāng)前行滿足模式時太颤,默認(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 開始處理第一行時,變量 i 被初始化龄章,變量 i 在被初始化時值為 "空"吃谣,
# 在 awk 中,數(shù)字0或者 "空字符串"表示 "假"做裙,非0或非空字符串表示"真" 所以
# 可以認(rèn)定上述模式為假岗憋,那就是模式不成立所以不需要執(zhí)行對應(yīng)的動作,但是i直接取
# 反了,對假取反就是真菇用,將取反后的值又賦值給了變量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é)尾
本文就打印文件奇偶行的問題花費的筆墨最多,而且介紹了三種方法來實現(xiàn)卦绣,要知道實際開發(fā)中打印文件奇偶行并不常見耐量,至少我工作到現(xiàn)在,幾乎每天都要處理文本滤港,還沒有碰到過打印文件奇偶行的需求廊蜒,那么我們?yōu)槭裁催€要學(xué)習(xí)哪趴拧?我也想過這個問題,上過高中的同學(xué)都有過這么的經(jīng)歷山叮,最后高考的題都有固定的題型著榴,我們在平時的學(xué)習(xí)中做練習(xí)冊的時候會發(fā)現(xiàn)有些題型怪怪的,根本不符合高考的出題規(guī)范屁倔,那么這類題的意義是什么哪脑又?高中數(shù)學(xué)老師的解釋是:“這類題型高考不會出,可是這類題你們也要做锐借,因為這可以讓你們更好的理解這個知識點”问麸,同樣的,在這里它就可以幫我們更好的理解 awk 這個命令钞翔,如果你把第三種打印文件奇偶行的方式搞的很明白的話严卖,你就會發(fā)現(xiàn),你更加了解 awk 包括它的一些默認(rèn)處理布轿,你和 awk 的距離就拉近了哮笆,以后遇到文本格式化問題使用 awk 就會變得得心應(yīng)手^_^