Chinaunix

标题: awk左连接问题 [打印本页]

作者: sundful    时间: 2011-08-18 16:51
标题: awk左连接问题
有两个文件1.txt和2.txt,
1.txt的数据如下所示:
  1. 2929292
  2. 8282828
  3. 7878787
  4. 6767676
  5. 4545454
复制代码
2.txt的数据显示如下:
  1. 2929292|11
  2. 8282828|22
  3. 7878787|33
  4. 6767676|44
复制代码
现在想根据1.txt的数据查询2.txt,最后显示的结果如下:
  1. 2929292|11
  2. 8282828|22
  3. 7878787|33
  4. 6767676|44
  5. 4545454|0
复制代码
也就是1.txt的数据会全部保留,如果1.txt的数据在2.txt不存在,则数据的值置为0,如:4545454|0
最后把结果文件输出到一个文件里!

求助大家献计献策!
作者: ywlscpl    时间: 2011-08-18 17:02
awk -F '|' 'NR==FNR{a[$1]=$2;next}{print $1"|"$1 in a?a[$1]:0}' 2.txt 1.txt >newfile
作者: icybay    时间: 2011-08-18 17:06
如果不要显示0的话,join倒是很方便
作者: sundful    时间: 2011-08-18 17:08
本帖最后由 sundful 于 2011-08-18 17:11 编辑

回复 3# icybay
哦,谢谢您,但是好像必须需要显示这个0,左连接嘛!
作者: sundful    时间: 2011-08-18 17:11
本帖最后由 sundful 于 2011-08-18 17:16 编辑

回复 2# ywlscpl
正在测试,一会回复结果,谢谢您!~

输出的结果:
  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 0
  7. 0
  8. 0
  9. 0
  10. 0
复制代码
好像还有些问题!
作者: icybay    时间: 2011-08-18 17:12
回复 4# sundful

还真不太会,如果用Perl很好搞
作者: ywlscpl    时间: 2011-08-18 17:22
回复 1# sundful


不好意思,  没测试
你把$1 in a?a[$1]:0
用括号括起来
($1 in a?a[$1]:0)
  1. awk -F '|' 'NR==FNR{a[$1]=$2;next}{print $1"|"($1 in a?a[$1]:0)}' 2.txt 1.txt >newfile
复制代码

作者: icybay    时间: 2011-08-18 17:32
回复 7# ywlscpl

求解释
作者: ywlscpl    时间: 2011-08-18 17:39
awk -F '|' 'NR==FNR{a[$1]=$2;next}{print $1"|"($1 in a?a[$1]:0)}' 2.txt 1.txt >newfile

1、awk 读入2.txt的时候满足条件NR==FNR,执行{a[$1]=$2;next},a[$1]=$2以$1为数组下标,$2为数组值建立数组,这样2.txt第一列和第二列建立了对应关系。next表示结束当前程式处理,读入下一行数据,也就是后面那部分awk语句不会执行了。
2、awk读入1.txt的时候,会执行{print $1"|"($1 in a?a[$1]:0)}
($1 in a?a[$1]:0)是问号表达式,$1 in a条件成立,表达式值为a[$1],否则值为0
作者: sundful    时间: 2011-08-18 17:44
本帖最后由 sundful 于 2011-08-18 17:59 编辑

回复 7# ywlscpl

太感谢了,这个问题解决了,非常感谢,以后多看看你发的帖子得!
作者: ywlscpl    时间: 2011-08-18 17:48
回复 10# sundful


剩余 什么意思?
作者: icybay    时间: 2011-08-18 17:49
回复 9# ywlscpl


   谢谢了,解释的很好,明白了
作者: sundful    时间: 2011-08-18 18:07
本帖最后由 sundful 于 2011-08-18 18:11 编辑

回复 11# ywlscpl

其实就是两个文档取差集!即2.txt-1.txt 把结果输出到另外的文件里即可
作者: mpstat    时间: 2011-08-18 19:51
awk -F"|" '{if(NR==FNR) a[$0]=0; else a[$1]=$NF;}END{for(v in a) printf("%s|%s\n", v, a[v]);}' file1 file2
作者: 251995427    时间: 2011-08-19 09:48
本帖最后由 251995427 于 2011-08-19 09:51 编辑

回复 11# ywlscpl

能不能写一个调换2个文件顺序的,比如你给的答案是
awk -F '|' 'NR==FNR{a[$1]=$2;next}{print $1"|"($1 in a?a[$1]:0)}' 2.txt 1.txt >newfile

那么awk  ******   1.txt 2.txt 中间那部分该怎么写,,顺便讲一下原因,谢谢了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2