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 |
3.
file:
4.
方法二: 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.
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”即可。