awk实现Left、join查询、去除重复值以及局部变量讲解例子
本文导语: 最近看到论坛里面有几个不错的小例子,对于学习awk还是有帮助,在这儿详细的说一下 一、类似数据库中的left join查询 代码如下: [root@krlcgcms01 mytest]# cat a.txt //a.txt 111 aaa 222 bbb 333 cccc 444 ddd [root@krlcgcms01 myt...
最近看到论坛里面有几个不错的小例子,对于学习awk还是有帮助,在这儿详细的说一下
一、类似数据库中的left join查询
[root@krlcgcms01 mytest]# cat a.txt //a.txt
111 aaa
222 bbb
333 cccc
444 ddd
[root@krlcgcms01 mytest]# cat b.txt //b.txt
111 123 456
2 abc cbd
444 rts 786
要求输出结果是
111,aaa,123,456
444,ddd,rts,786
实现方法:
[root@krlcgcms01 mytest]# awk 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1]{print $1","a[$1]","$2","$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786
解释:当NR和FNR相同时,这就说明在对第一个文件进行操作,a[$1]=$2表示,建立一个数组,以第一个字段为下标,第二个字段为值。当NR!=FNR时,说明在对第二个文件进行操作,注意:这个时候的$1和前面的$1不是同一个东西了,前面的$1表示的是a.txt的第一个字段,而后面的$1表示的是b.txt的第一个字段。a[$1]表示以b.txt中第一个字段的为下标的值,如果a[$1]有值的话,说明也存在于a.txt文件中,这样就把数据print出来就行了。
实现方法2:
[root@krlcgcms01 mytest]# awk -v OFS="," 'NR==FNR{a[$1]=$2;} NR!=FNR && $1 in a { print $1,a[$1],$2,$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786
解释:-v OFS=","这个是设置输出时的列分割符,$1 in a这个是b.txt文件中的第一列的值是不是在数组a的key中,这个对做程序的来说很好理解,各种语言当中都有这样的用法,或者函数。例如,php中有in_array函数。比较一下,方法1和方法2中的print,方法1我加了双引号,方法2我却没有加,但是输出的效果却是一样的。
二、去除重复的值
[root@krlcgcms01 mytest]# cat repea //文件repea
a b
c d
e f
b d
b a
f e
1 2
2 1
如果有a,b和b,a这样的情况,就删除b,a,当然数字也一样;
实现方法1:
awk '{for(i=1;i