免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1849 | 回复: 5

[文本处理] 请问如何理解这个awk命令 [复制链接]

论坛徽章:
0
发表于 2012-08-29 10:51 |显示全部楼层
  1. awk 'NR == FNR {file1[$0]++;next} {if($0 in file1) {file1[$0]=same;next}} {file2[NR]=$0} END {for (i in file2) print file2[i]; for (i in file1);while(file1[i]--) print i}' file1  file2
复制代码
它的作用是对两个文件的各自多出来的内容进行抽取合并。

这个命令如何理解,请帮忙分步解释一下,谢谢。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2012-08-29 11:16 |显示全部楼层
本帖最后由 rdcwayx 于 2012-08-29 13:16 编辑

先了解一下awk 里的关联数组用法。 再看看基础, 给你分行,希望有帮助。
  1. awk 'NR == FNR {file1[$0]++;next}    # 只针对 file1, 后面的语句, END 前都是针对file2的。
  2.         {if($0 in file1) {file1[$0]=same;next}}
  3.         {file2[NR]=$0}
  4.         END {for (i in file2) print file2[i]; for (i in file1);while(file1[i]--) print i}' file1  file2
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2012-08-29 11:39 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
发表于 2012-08-29 12:44 |显示全部楼层
把第一个文件的每一行的内容作 key  后面一个文件的每一行做 key 看看是否已经存在 就出来了

论坛徽章:
0
发表于 2012-08-29 23:13 |显示全部楼层
本帖最后由 zxb167 于 2012-08-30 17:01 编辑

把文件的内容稍微修改了下,但是功能完全相同,只是自己看的明白点。
自己对
{if($0 in file1) {file1[$0]=same;next}}
{file2[NR]=$0}
这段代码知道什么意思,但是还不是太能够理解,希望哪位大牛能够指点一二,小弟在些先谢了,

修改后的代码如下:
文件: different.awk

NR == FNR {file1[$0]++;next}
{
        if($0 in file1)
                {file1[$0]=same;next}
        else
                {file2[NR]=$0}
}
END{
        for (i in file2)                         #file2中独有的内容
                 print file2;
        for (i in file1)
        {
                        while(file1--)        #file1中独有的内容,file1中可能存在内容相同的记录
                                print i
        }
}

执行:
awk -f different.awk file1 file2

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2012-08-30 13:52 |显示全部楼层
zxb167 发表于 2012-08-30 01:13
{if($0 in file1) {file1[$0]=same;next}}
{file2[NR]=$0}
这段代码知道什么意思,...


file1 在这个例子里是个关联数组, 其下标就是 文件 file1 的每行内容。

"$0 in file1 " 是个判断,确认 文件2 的每一行是否和 数组 file1 的下标有相同的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP