免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11422 | 回复: 12
打印 上一主题 下一主题

求教一个awk比较两个文件的某几个字段的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-20 19:45 |只看该作者 |倒序浏览
file1.txt
  1. 111 222 333 444 xxx
  2. eee fff ggg hhh xxx
  3. iii jjj kkk lll xxx
复制代码
file2.txt
  1. 111 222 333 444 yyy
  2. 555 666 777 888 yyy
  3. 111 222 444 333 yyy
  4. 555 666 888 999 yyy
  5. aaa bbb ccc ddd yyy
  6. eee fff ggg hhh yyy
  7. iii jjj kkk lll yyy
复制代码
想得到:
  1. 555 666 777 888 yyy
  2. 111 222 444 333 yyy
  3. 555 666 888 999 yyy
  4. aaa bbb ccc ddd yyy
复制代码
实现目的是要前面三个字段作为比较的项
如果file2里面的前三项,在file1里面存在,就不打印,也就是只打印file1前三项在file2中不存在的。


我仿照了网上一些关于awk比较文件的办法,组合了两个数组比较,可是没有成功
awk ' NR==FNR {a[NR]=$1"x"$2"x"$3} NR>FNR&&!(b[FNR] in a)  {b[FNR]=$1"x"$2"x"$3; print $0}' file1.txt file2.txt

都把file2.txt打出来了


请问应该怎么实现呢?

论坛徽章:
0
2 [报告]
发表于 2010-05-20 20:20 |只看该作者
  1. awk '{NF=NF-1}1' file1.txt|grep -vf- file2.txt
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-05-20 20:54 |只看该作者

  1. awk 'NR==FNR{a[$1"_"$2"_"$3]=1}NR!=FNR&&!a[$1"_"$2"_"$3]' file1.txt file2.txt

复制代码

论坛徽章:
0
4 [报告]
发表于 2010-05-20 22:03 |只看该作者
where27 发表于 2010-05-20 20:20



    请问一下,我这里看不懂:
awk '{NF=NF-1}1' file1.txt  
这里的{NF=NF-1}1是什么意思呢?我试了把大括号外面的1改成0,没有东西输出,改成非0的数字就可以,但改英文又没有输出了,请问一下这里是什么意思呢?

另外后面的grep -vf-  这里的第二个减号是什么意思呢,我man grep也没有找到答案,恳请指点一下,谢谢您。

论坛徽章:
0
5 [报告]
发表于 2010-05-20 22:09 |只看该作者
springwind426 发表于 2010-05-20 20:54


恳请指点一下,您命令里面的数组用法吗?是怎么利用a数组控制到file2.txt的呢?
我的那个也是想达到您这样的效果,可是我就用了两个数组就不行了

论坛徽章:
0
6 [报告]
发表于 2010-05-20 22:22 |只看该作者
回复 5# keymanlu

你不是想用前4个字段来做标识吗?

awk 没有多维数组,但是,可以通过某种方式把几个字段合成一个字符串,来做一维数组的下标

比如:
  1. $1 "_" $2 "_" $3 "_" $4
复制代码
就是用 _ 来连接1-4这4个字段

NR==FNR 是 file1.txt
NR!=FNR 是 file2.txt

论坛徽章:
0
7 [报告]
发表于 2010-05-20 23:23 |只看该作者
回复  keymanlu

你不是想用前4个字段来做标识吗?

awk 没有多维数组,但是,可以通过某种方式把几个 ...
springwind426 发表于 2010-05-20 22:22



    哦,明白了,谢谢您,我学到了数组下标也可以用字段的组合,请问这是否就是叫做awk的“二维数组”的用法呢?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2010-05-20 23:40 |只看该作者
回复 7# keymanlu


6楼说了,没有多维数组,只有一维数组。

论坛徽章:
0
9 [报告]
发表于 2010-05-23 09:51 |只看该作者
awk 'NR==FNR{array[$1" "$2" "$3" "$4]}NR>FNR{if(!($1" "$2" "$3" "$4 in array)){print}}' linux.151 linux.152

论坛徽章:
0
10 [报告]
发表于 2010-05-23 10:44 |只看该作者
  1. #!/bin/awk -f
  2. {if(NR==FNR){
  3.     for(i=1;i<NF;i++)
  4.        string=string" "$i;
  5.     #print string;
  6.     array[string];
  7.     string="";
  8.    }
  9. else if(NR>FNR){
  10.     for(j=1;j<NF;j++)
  11.        str=str" "$j;
  12.      
  13.     if(!(str in array))
  14.        print $0;
  15.    
  16.     str="";
  17.    }
  18. }
复制代码
./test01.awk file01 file01_1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP