sed && awk (3)====awk 的十道邏輯題

這不是我總結的,但我以爲總結的很好,因此把它放在博客裏但願更多人看到。ide


#awk之行與列的count & sum命令總彙博客

#有一個文件file,內容以下:it

10 11 12 13 14class

15awk

16 17 18 19file

20 21方法

22 23 24 25總結


#需求一:每行字段數sort

5di

1

4

2

4


**方法一:[root@ /tmp/cdly]# awk '{print NF}' file


#需求二:最大字段數

5


**方法一:[root@ /tmp/cdly]# awk 'NF>max{max=NF}END{print max}' file


#需求三:總共字段個數

16


**方法一:[root@ /tmp/cdly]# awk '{a+=NF}END{print a}' file


#需求四:全部字段的總和

280


**方法一:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++){a+=$i}}END{print a}' file 


#需求五:各行字段的總和

60

15

70

41

94


**方法一:[root@ /tmp/cdly]# awk '{a=0;for(i=1;i<=NF;i++){a+=$i};print a}' file


#需求六:各列的總和

83 72 54 57 14


**方法一:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{for(i in a)printf a[i]" ";print ""}' file #輸出結果是無須的

**方法二:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{l=length(a);for(j=1;j<=l;j++) printf a[j]" ";printf "\n"}' file

**方法三:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{for(i=1;i<=asorti(a,b);i++)printf a[b[i]]" ";print ""}' file


#需求七:每行的最大值

14

15

19

21

25


**方法一:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++){if($i>max){max=$i}}print max;max=0}' file


#需求八:每列的最大值

22 23 24 25 14


**方法一:[root@ /tmp/cdly]# awk 'NF>max{max=NF}{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(i=1;i<=max;i++){for(j=1;j<=NR;j++){if(a[j,i]>b){b=a[j,i]}}printf b" ";b=""}print ""}' file


#需求九:行列交換

10 15 16 20 22 

11 17 21 23 

12 18 24 

13 19 25 

14


**方法一:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(i=1;i<=NR;i++){for(j=1;j<=NR;j++){if(a[j,i]){printf a[j,i]" "}}print ""}}' file


#需求十:行列交換而且以空格補齊空白處

10 15 16 20 22 

11   17 21 23 

12   18   24 

13   19   25 

14


**方法一:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(i=1;i<=NR;i++){for(j=1;j<=NR;j++){if(a[j,i]){printf a[j,i]" "}else{printf "   "}}print ""}}' file

**方法二:[root@ /tmp/cdly]# awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(i=1;i<=NR;i++){for(j=1;j<=NR;j++){printf "%-3s",a[j,i]}print ""}}' file

相關文章
相關標籤/搜索