linux命令(39):shell 打印偶數行,奇數行 ,行號


awk 命令:

1、

打印行號和內容:

awk '{print NR":"$0}'

2、

輸出:偶數行和奇數行到文件

awk '{print $0.txt > NR%2.txt}'  file

3、

打印出奇數行內容:(三者等價)

awk 'NR%2==1' file  

awk 'NR%2' all_file.txt

awk 'i=!i' file

打印出偶數行的內容:(三者等價)

awk 'NR%2==0' file

awk '!(NR%2)' file

awk '!(i=!i)' file

sed 命令:

打印出奇數行:

sed -n '1~2p'  file

打印出偶數行:

sed -n '2~2p' file

 

擴展內容:

 

 

一. 行距:

1. 每行間加一個空行

 

awk '1; { print "" }'   filname.ext             #輸出當前行,在輸出一個空行

awk '1 { print } { print "" }'   filname.ext

awk '{ print } { print "" }'   filname.ext

2. 1的另外一種實現方法:

 

awk 'BEGIN { ORS="\n\n" }; 1'   filname.ext    #預先設置每一行的分隔符號為兩個換行;你可以嘗試把ORS設置為其他的看看效果如何

3. 僅輸出非空行,並每行間在加一個空行

 

awk 'NF { print $0 "\n" }'   filname.ext       #NF表示當前行的字段數,$0表示當前行,最后再加一個換行

4. 雙倍行距;沒行間兩個空行

 

awk '1; { print "\n" }'   filname.ext     #默認輸出后會換行的,輸出\n,則會輸出兩個空白行

等同於:

 

awk '{ print; print "\n" }'   filname.ext

5. 顯示當前行在所在文件中的行號

 

awk '{ print FNR "\t" $0 }'   filname.ext      #FNR,表示當前行在文件中的行號

6. 顯示當前行在本次處理過程中的行號

 

awk '{ print NR "\t" $0 }'   filname.ext       #NR,表示當前行在本次處理過程中的行號

小疑問:為啥有FNR和NR的差別呢?效果不都是一樣么? 如果你給如:filname1.ext filname2.ext,你就會看到差別了。原來:FNR,是每個文件中的,換了一個文件,會歸零;而NR則每個文件會累加起來的

 

7. 使用簡單樣式來輸出

 

awk '{ printf("] : %s\n", NR, $0) }'   filname.ext    #行號占用5位,不足補空格

8. 顯示非空行

 

awk 'NF { $0=++a " :" $0 }; { print }'   filname.ext

#NF前面說了,表示當前行的行號,此處用他作為條件,如果是空行,則NF為0,跳過;否則,用動態變量a存儲非空行的數目

9. 計算行數:效果類似wc -l

 

awk 'END { print NR }'   filname.ext    #END表示每行都處理完了后,在執行,此時NR就是最后一行的行號,也就是總的行數了。

10. 計算每一行的和

 

awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }'   filname.ext

#s用作每行和的累加,從1到NF(每行總的字段數),依次累加

 

11. 計算文件中所有字段的和

 

awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }'   filname.ext

#s用作總和的累加,每行都處理完成了,再輸出s;注意和10對比,此處沒有每行清零,所以累加了。沒有設置的變量,默認為空,但是會根據上下文數值計算情況自動變為0

12. 將每個字段用其絕對值代替

awk '{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }'  filname.ext

#$i表示當前行中的字段,$0表示當前行,可以改變$i的值

13. 計算文件中總的字段和(例如計算單詞數)

awk '{ total = total + NF }; END { print total }'  filname.ext

14. 計算匹配指定信息的總行數

awk '/Linux/ { n++ }; END { print n+0 }'  filname.ext

15. 找到文件中每行第一個字段中,最大的數,以及其所在的行

awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }'  filname.ext

#用max存儲最大的數,maxline存儲最大數所在的行,並在最后輸出

16. 顯示當前行的字段數,並輸出當前行

awk '{ print NF ":" $0 } '  filname.ext

17. 顯示每行最后一個字段的內容

awk '{ print $NF }'  filname.ext   #NF表示當前行的字段數,例如為3,則$NF,就是$3,也就是第三個字段了

18. 顯示最后一行的最后一個字段

awk '{ field = $NF }; END { print field }'  filname.ext

#每行處理沒有輸出,盡在最后輸出,field作為每行的最后一行的暫存變量

19. 顯示字段數小於4的行

awk 'NF < 4'  filname.ext   #{}以外的內容,作為條件,沒有{},則默認輸出當前行

20. 顯示每行的最后一個字段小於4的行

awk '$NF < 4'  filname.ext   #注意和19對比


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM