且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

sed && awk (3)====awk 的十道逻辑题

更新时间:2022-09-22 21:27:15

这不是我总结的,但我觉得总结的很好,所以把它放在博客里希望更多人看到。


#awk之行与列的count & sum命令总汇

#有一个文件file,内容如下:

10 11 12 13 14

15

16 17 18 19

20 21

22 23 24 25


#需求一:每行字段数

5

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]



本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1971269,如需转载请自行联系原作者=$i}END{for(i=1;i<=NR;i++){for(j=1;j<=NR;j++){printf "%-3s",a[j,i]}print ""}}' file