1、实例1
怎样的shell才能使file1、file2两个文件的$2不同的话,取出全局$0?
注意:比较两个文件的$2的时候,一定要第一列相同的情况下才比较
1.1、操作文件
# cat file1
00001 20
00002 31
00003 04
00004 56
00005 94
00006 73
00007 25
00008 86
00009 19
00010 52
# cat file2
00001 20
00007 28
00002 32
00004 56
00010 52
1.2 实现命令
# paste file1 file2|awk '{if(($1=$3)&&($2!=$4)) {print $0}}'
00007 31 00007 28
00002 04 00002 32
00010 94 00010 52
其它:
#cat file1 file2|sort |uniq –u
三楼的答案是错的,我要的结果是
00002 31 32
00007 25 28
sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
or
sort file1 >f1;sort file2 >f2; join -1 1 -2 1 f1 f2|awk '$2 != $3'
2、实例2
#cat fawk.a
1 xiao 25 beijing 9000
2 liuwenjing 24 beijing 5000
3 weijianjun 29 shanghai 8000
4 wanmingyang 28 beijing 5000
5 tianzhiyu 25 beijing 5500
6 zhouhaoxing 23 beijing 5000
2.1 显示$2等xiao或$2等于liu的全行
[root@store_2 awk]# awk '{ if(($2=="xiao")||($2=="liu")) print $0 }' fawk.a
1 xiao 25 beijing 9000
2.3 显示$2等xiao或$2包含liu的行
[root@store_2 awk]# awk '{ if(($2=="xiao")||($2~/liu/)) print $0 }' fawk.a
1 xiao 25 beijing 9000
2 liuwenjing 24 beijing 5000
2.3 计算共显示了多少行NR
[root@store_2 awk]# awk '{ print $0 } END { print "总行数:" NR }' fawk.a
1 xiao 25 beijing 9000
2 liuwenjing 24 beijing 5000
3 weijianjun 29 shanghai 8000
4 wanmingyang 28 beijing 5000
5 tianzhiyu 25 beijing 5500
6 zhouhaoxing 23 beijing 5000
总行数:6
2.4 显示当前路径的最后一个目录名
echo $PWD | awk -F/ '{ print $NF}'
echo $PWD | awk -F/ '{ print NF}' # 显示列或域数目
echo $PWD | awk -F/ '{ print NF-1}' # 计算
2.4 替换函数
# hehe替换xiao
[root@store_2 awk]# awk 'gsub(/xiao/,"hehe")' fawk.a //$0 中,xiao替换liu
1 hehe 25 beijing 9000
同:sed 's/xiao/hehe/' fawk.a ,但显示所有记录
2.5 长度函数
[root@store_2 awk]# awk '{ print length($4) }' fawk.a
7
7
…..
2.6 分割函数
split(s,a,t) //t为分隔标准,s为字符,a为数组,a[1],a[2]....
2.7 计算当然目录下所有文件大小
2.7.1 单命令
[root@store_2 awk]# ll|awk '{total+=$5} { print $0} END { print total }' #可以加多个{}
总计 16
-rw-r--r-- 1 root root 354 10-29 01:55 fawk.a
-rwxr-xr-x 1 root root 61 10-29 04:34 it.awk
415
2.7.2 编程
[root@store_2 awk]# cat it.awk
#!/bin/awk -f
(total+=$5)
END {print "总大小:" total }
[root@store_2 awk]# ll|./it.awk
-rw-r--r-- 1 root root 354 10-29 01:55 fawk.a
-rwxr-xr-x 1 root root 61 10-29 04:34 it.awk
总大小:415
3 实例3
3.1 删除所有空白行
将一个文件里所有的空白行删除
代码::
$ awk 'NF>0' test1.dat
one 123-321 234/22 a
two 344-637 726/28 c
three 273-287 287/97 d
four 872-872 282/20 c
3.2 输出一个文件的偶数行
代码::
$ awk 'NR %2 ==0' test1.dat
two 344-637 726/28 c
four 872-872 282/20 c
3.3 输入范围是1到100的七个随机数
代码::
$ awk 'BEGIN{for (i=1;i<7;i++) print int(101*rand())}'
24
29
85
15
59
19
3.5 输出本目录下所有文件的字节数
代码::
]$ ls -l |awk '{x+=$5}; END{print x}'
15827
3.6 显示UID>500的用户记录
[root@store_2 awk]# awk -F: '$3>500 { print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
也可以这样写:
[root@store_2 awk]# awk -F: '{ if($3>500) print $0 }' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@store_2 awk]# awk -F: '{ if($3>500) {print $0} }' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
以下为错误写法:
a、 [root@store_2 awk]# awk -F: '{ $3>500 print $0 }' /etc/passwd
awk: { $3>500 print $0 }
awk: ^ syntax error
b、 awk -F: '{$3>500} {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
。。。。。。。。。
作者“风云的博客”