1. file:
4 6 7 8
3 4 2 1
5 6 7 10
3 4 5 5
3 3 2 1
5 6 1 10
假如把3列和4列的和值作为新的第5列,第5列的平均值为avg5,求第5列中大于avg5的行数
awk '{x+=$3+$4;a[NR]=$3+$4}END{avg5=x/NR;for(i in a){if(a[i]>avg5) print i}}' file | sort
(注:因为for(i in a),所以,有可能结果不按顺序打印。故,加了一个sort命令排序)

或者:

awk '{x+=$3+$4;a[NR]=$3+$4;avg5=x/NR}END{for(i=1;i<=length(a);i++){if(a[i]>avg5) print i}}' file

 

2.

file:                        |        要求结果为:

1.1.1.1 11             |          1.1.1.1 11 22 33 44
1.1.1.1 22             |          2.2.2.2 11 22 33 44
1.1.1.1 33             |
1.1.1.1 44             |
2.2.2.2 11             |
2.2.2.2 22             |
2.2.2.2 33             |
2.2.2.2 44             |

 

1. awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}' file
2. perl -e 'open f,"<","file";while(<f>){($k,$v)=(split);if(exists $hash{$k}){$hash{$k}.=" $v"}else{$hash{$k}=$v}}foreach(sort keys %hash){print "$_ $hash{$_}\n"}'

 

 

3.

file:

12 34 56
78 90 12
34 56 89
以最后一个域为准,进行排序:
awk '{a[$NF]=$0} {var=asorti(a, b);for(i=1;i<=var;i++)print a[b[i]]}' file
12 34 56
23 45 89
78 90 12

4.

 

file1:                        file2:                        结果:
100 Tony yang          100  $1000.00            100 Tony yang     $1000.00          
200 Mike li                200  $2500.00            200 Mike li           $2500.00
300 Tome zhang       300  $3000.00            300 Tome zhang  $3000.00
   方法一:awk 'ARGIND==1{a[$1]=$0};ARGIND==2{print a[$1],$2}' file1 file2

     方法二:  paste file1 file2 | awk '{print $1,$2,$3,$NF}' 

     方法三: awk 'NR==FNR{a[$1]=$0};NR>FNR{print a[$1],$2}' file1 file2

5.

file1:

Tony huaxue 90
yang huaxue 80
Tony wuli 70
yang wuli 60


awk '{b[$1]=$1} {a[$1]+=$3} END {for(i in b);for(i in a){y=a[i]/length(a);printf("%-s平均成绩为:\t%2.2f\n",b[i],y)}}' file1

result:

Tony平均成绩为:    80.00
yang平均成绩为:    70.00

分析:此题一步一步来:

先打印名字:

awk '{b[$1]=$1}END{for(i in b)print b[i]}' file1

Tony
yang

然后打印分数:(这个是关键)

awk '{a[$1]+=$3}END{for(i in a){y=a[i]/length(a);print y}}' file1

80
70
再把2个整合:

awk '{b[$1]=$1} {a[$1]+=$3} END {for(i in b);for(i in a){y=a[i]/length(a);printf("%-s平均成绩为:\t%2.2f\n",b[i],y)}}' file1
 

6.  file1:

a

b

c

d

file2:

a

b

a

b

d

e

要找出第一个文件中的各行在第二个文件出现的次数

awk 'ARGIND==1{a[NR]=$0;next}{c[$0]++}END{for(i=1;i<=length(a);i++)print a[i],c[a[i]]}'  file1  file2

 

7.

file1:

123456789
abcdefghi
... ...
现在想要随机抽取5列组成下面的内容,允许重复:
例如结果:
36612
cffab
... ...

awk -F "" 'BEGIN{ORS="";srand();for(i=1;i<=5;i++)a[i]=int(rand()*100%9+1)}{for(i=1;i<=5;i++)print $a[i]}' file1 | sed -r 's/([0-9]+)([a-z]+)/\1\n\2\n/g'
 

8.

file1:

asdfasdfasdfadfasdfa

wqrweqrqwer234123

asdfqwer23412344w

请打印这些字符串,要求输出结果是随机的颜色:

Color.awk脚本:

#!/usr/bin/awk

# Written by Tony

# run:awk -f Color.awk filename

BEGIN{
srand()
}
{
        split($0, a, "")
        ColorPrint(a, length($0))
}


function ColorPrint(a, len)
{
        for(i=1;i<=len;i++)
        {  
                Color=int(31+7*rand())
                printf "\033[01;"Color"m"a[i]"\033[0m"
        }  
        printf"\n"
}
 

运行脚本awk -f Color.awk file1

 

9.

file1:

95      94      93       92     张三
85      84      83       82     张四
75      74      73       72     张五
65      64      63       62     张六
file2:

99      90      97       98     李四
87      82      85       80     李五
87      83      85       80     李五
80      70      63       82     李六
70      68      68       72     李七
需求:file1中每一行去逐个匹配file2中的每一行,例如:

95      94      93       92     张三
99      90      97       98     李四
然后对匹配的所有域(除去$5名字这一列)比较,如果每一个比较域相减的绝对值小于等于2,打印出来。

操作:

#! /usr/bin/awk
ARGIND==1{
        file_f1[NR] = $1;
        file_f2[NR] = $2;
        file_f3[NR] = $3;
        file_f4[NR] = $4;
        file_f5[NR] = $5;
next};
{
        for(i=1;i<=NR;i++)
        {
                        if((abs(file_f1[i], $1)<=2) && (abs(file_f2[i], $2)<=2) && (abs(file_f3[i], $3)<=2) && (abs(file_f4[i], $4)<=2))
                        {
                                print file_f1[i],file_f2[i],file_f3[i],file_f4[i],file_f5[i]
                                print $1,$2,$3,$4,$5
                        }
                }
}
function abs(a, b)
{
        z=a-b;
        z=(z>0)?z:(-1)*z
        return z
}
因为,awk中没有求绝对值的函数,所以自己定义了一个abs函数。然后处理。

处理结果:

[root@www ~]# awk -f  file.awk file1 file2
85 84 83 82 张四
87 82 85 80 李五
85 84 83 82 张四
87 83 85 80 李五
  10.

file1:

a 11 22 33 44

b 22 33 44 55

c 33 44 55 66

file2:

a aa bb cc dd

b cc dd aa bb

c dd ee ff gg

d 11 22 33 44

e aa ee 22 44

要求:每个文件以第一列为索引,把文件2中,在文件1中没有出现的打印出来。

run: awk 'NR==FNR{a[$1]=1;next}{if(a[$1]!=1)print $0}' file1 file2

备注:其中1为一个标记,所以这里可以换成除了0外的任何数字。

-------------------------------------------------------------------

11题:

把文件1中和文件2中,姓名相同的信息筛选出来,最后数据为“name sex number”即可。

[xxx@vm-yang ~]# cat file1
yang nan
peng nv
hao nan
[xxx@vm-yang ~]# cat file2
yang 100
hao 20
zhang 30
tian 10
[xxx@vm-yang ~]# awk 'NR==FNR{a[NR]=$1;b[NR]=$2;next}{for(i in a){if(a[i]==$1)print $1,b[i],$2}}' file1 file2
yang nan 100
hao nan 20
----------------------------------------------------------------------------------------------------------------------------------------
12题:
把文件中,出现相同的字母,后面的数字相加,求最后的结果。
[xxx@vm-yang ~]# cat file3
a 10
b 10
c 10
d 10
b 10
d 20
[xxx@vm-yang ~]# awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file3
a 10
b 20
c 10
d 30