免费注册 查看新帖 |

Chinaunix

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

awk处理两个文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-16 19:02 |只看该作者 |倒序浏览
本帖最后由 dashorc 于 2012-01-16 19:04 编辑

cat file1:

9 1     28234   131072
9 0     28298   131072
25 0    28362   131072
20 0    28426   131072
10 0    28490   131072
2 0     28554   131072
3 0     28618   131072
5 0     28682   131072

cat file2:

<!-- Name:0x25 -->
<forward cmd="0x25" sub_cmd="any" l5_mod_id="25" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<!-- Name:0x09 r -->
<forward cmd="0x09" sub_cmd="0x00" l5_mod_id="9" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x02" l5_mod_id="9" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x03" l5_mod_id="9" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<!-- Name:0x09 w -->
<forward cmd="0x09" sub_cmd="0x01" l5_mod_id="9" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x04" l5_mod_id="9" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />

现在需要比较两个文件,如果file2里面的l5_mod_id 和l5_cmd_id和file1里面的第一列和第二列的值相等,那么将l5_mod_id后面的值替换成file1文件的第三列值。

最终想要的文件应该为:

<!-- Name:0x25 -->
<forward cmd="0x25" sub_cmd="any" l5_mod_id=" 28362" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<!-- Name:0x09 r -->
<forward cmd="0x09" sub_cmd="0x00" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x02" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x03" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
<!-- Name:0x09 w -->
<forward cmd="0x09" sub_cmd="0x01" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
<forward cmd="0x09" sub_cmd="0x04" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />


自己写了一个,但是得不出来结果
awk 'BEGIN{FS="[\" \t]"}NR==FNR{a[$1]=$1"X"$2;b[$1]=$3}NR>FNR{c=$9"X"$12;if(c=a[$9]) $9=b[$6]}' file1 file2

但是awk 'BEGIN{FS="[\" \t]"}NR==FNR{a[$1]=$1"X"$2;b[$1]=$3}NR>FNR{c=$9"X"$12;if(c=a[$9]) $9="1111";print}' file1 file2
这个是可以打印出来
为什么我的b[$1]=$3取不到值?

论坛徽章:
0
2 [报告]
发表于 2012-01-16 19:08 |只看该作者
过年放假,求高手指点啊,每次手工改文件很恶心

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-01-16 19:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-01-16 19:51 |只看该作者
本帖最后由 lionfun 于 2012-01-16 19:51 编辑

回复 1# dashorc

我也来试一个一般般的
  1. [root@local ~]# awk 'NR==FNR{a[$1$2]="l5_mod_id=\""$3"\"";next}NR>FNR && /forward/{t=$5;gsub(/l5_mod_id=|"/,"",$4);gsub(/l5_cmd_id=|"/,"",$5);$4=a[$4$5];$5=t}1' file1.txt file2.txt

  2. <!-- Name:0x25 -->
  3. <forward cmd="0x25" sub_cmd="any" l5_mod_id="28362" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  4. <!-- Name:0x09 r -->
  5. <forward cmd="0x09" sub_cmd="0x00" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  6. <forward cmd="0x09" sub_cmd="0x02" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  7. <forward cmd="0x09" sub_cmd="0x03" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  8. <!-- Name:0x09 w -->
  9. <forward cmd="0x09" sub_cmd="0x01" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
  10. <forward cmd="0x09" sub_cmd="0x04" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-01-17 10:02 |只看该作者
zooyo 发表于 2012-01-16 19:45
高手都On the way home。


谢谢,测试可用,不过楼下的简单一些

论坛徽章:
0
6 [报告]
发表于 2012-01-17 10:03 |只看该作者
lionfun 发表于 2012-01-16 19:51
回复 1# dashorc

我也来试一个一般般的



代码好用,原来我一直在钻牛角尖,看了您的代码恍然大悟哈

论坛徽章:
0
7 [报告]
发表于 2012-01-17 11:08 |只看该作者
本帖最后由 jiejie455 于 2012-01-17 11:08 编辑

awk 'NR==FNR{a["l5_mod_id=\""$1"\" l5_cmd_id=\""$2"\""]="l5_mod_id=\""$3"\" l5_cmd_id=\""$2"\""}NR>FNR{for(i in a){gsub(i,a,$0)};print $0}' file1 file2

论坛徽章:
0
8 [报告]
发表于 2012-01-17 14:14 |只看该作者
牛人啊,学习学习了

论坛徽章:
0
9 [报告]
发表于 2012-01-23 20:37 |只看该作者
本帖最后由 yangkyo821 于 2012-01-23 20:38 编辑
  1. [joe@joe-laptop test]$ awk 'NR==FNR{a[$1,$2]=$3;next}{FS="\"";OFS="\"";if(($6,$8) in a)$6=a[$6,$8]}1' 1 2
  2. <!-- Name:0x25 -->
  3. <forward cmd="0x25" sub_cmd="any" l5_mod_id="28362" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  4. <!-- Name:0x09 r -->
  5. <forward cmd="0x09" sub_cmd="0x00" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  6. <forward cmd="0x09" sub_cmd="0x02" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  7. <forward cmd="0x09" sub_cmd="0x03" l5_mod_id="28298" l5_cmd_id="0" protocol="udp" conn_pool_size="1" />
  8. <!-- Name:0x09 w -->
  9. <forward cmd="0x09" sub_cmd="0x01" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
  10. <forward cmd="0x09" sub_cmd="0x04" l5_mod_id="28234" l5_cmd_id="1" protocol="udp" conn_pool_size="1" />
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-01-23 21:47 |只看该作者
围观各路shell高手
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP