LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1719|回复: 11

如何用sed或awk将两个文件的域合并起来[基本解决]

[复制链接]
发表于 2004-4-16 23:30:02 | 显示全部楼层 |阅读模式
文件一例子:

  1. 1053
  2. 1054
  3. 1055
  4. 1070
  5. 1064
  6. 1083
  7. 1090
  8. 1093
  9. 1095
复制代码


文件二例子:

  1. 1053 10.0.0.128 abcde.com
  2. 1054 10.0.0.129 aaa.com
  3. 1055 10.0.0.130 dkeje.com
  4. 1063 10.0.0.131 jivnmei.com
  5. 1064 10.0.0.132 klasjief.com
  6. 1066 10.0.0.133 aksdjie.com
  7. 1089 10.0.0.134 klsiejfla.com
  8. 1090 10.0.0.135 askjdiev.com
  9. 1095 10.0.0.136 jalikej.com
复制代码


文件二中有三列分别是id, ip, and hostname, 但是这个文件生成的时间较早,id较老, 而文件一中的对应的id较新, 现在想将文件一中的id贴到文件二中的第二域的地方,这样就好比较哪些id有更新,哪些没变. 输出后的文件结构例子:

  1. 1053 1053 10.0.0.128 abcde.com
  2. 1054 1054 10.0.0.129 aaa.com
  3. 1055 1055 10.0.0.130 dkeje.com
  4. 1063 1070 10.0.0.131 jivnmei.com
  5. 1064 1064 10.0.0.132 klasjief.com
  6. 1066 1083 10.0.0.133 aksdjie.com
  7. 1089 1090 10.0.0.134 klsiejfla.com
  8. 1090 1092 10.0.0.135 askjdiev.com
  9. 1095 1095 10.0.0.136 jalikej.com
复制代码


如何用sed或是awk来完成这两个文件的域合并?
发表于 2004-4-16 23:37:21 | 显示全部楼层
是把文件1插到文件2的第2列,第1列要小于第2列,是这样的理解吧:ask
发表于 2004-4-16 23:45:33 | 显示全部楼层
  1. /home/javalee#paste file1 file2|awk '{print $2,$1,$3,$4}'
  2. 1053 1053 10.0.0.128 abcde.com
  3. 1054 1054 10.0.0.129 aaa.com
  4. 1055 1055 10.0.0.130 dkeje.com
  5. 1063 1070 10.0.0.131 jivnmei.com
  6. 1064 1064 10.0.0.132 klasjief.com
  7. 1066 1083 10.0.0.133 aksdjie.com
  8. 1089 1090 10.0.0.134 klsiejfla.com
  9. 1090 1093 10.0.0.135 askjdiev.com
  10. 1095 1095 10.0.0.136 jalikej.com
复制代码
不会是这样简单吧 ;)
 楼主| 发表于 2004-4-17 00:07:16 | 显示全部楼层
呵,谢谢javalee兄了,我都忘了有paste这样一个很爽的命令了。真该多复习复习了。我就想着纯用awk和循环,搞了半天也没有成。如果不用paste,能做吗?谢谢!
 楼主| 发表于 2004-4-17 00:15:40 | 显示全部楼层
细想一下,javalee老兄其实没有对正我的问题,方法是一定采纳了,但是就我的问题来说,是问的如何用sed或是awk来完成合并,而lee兄给的方案其实是用了paste来合并了。(最近疯狂学sed和awk,请见谅这种比较牛角尖的问题。)
发表于 2004-4-17 00:20:01 | 显示全部楼层
最初由 yongjian 发表
呵,谢谢javalee兄了,我都忘了有paste这样一个很爽的命令了。真该多复习复习了。我就想着纯用awk和循环,搞了半天也没有成。如果不用paste,能做吗?谢谢!


  1. /home/javalee#cat hb
  2. #!/bin/ksh
  3. while read -u3 a&&read -u4 b;do
  4. echo $(echo $b|awk '{print $1}') $a $(echo -n $b|awk '{for(i=2;i<=NF;i++)print $i}')
  5. done 3<file1 4<file2
复制代码
/home/javalee#ksh hb
1053 1053 10.0.0.128 abcde.com
1054 1054 10.0.0.129 aaa.com
1055 1055 10.0.0.130 dkeje.com
1063 1070 10.0.0.131 jivnmei.com
1064 1064 10.0.0.132 klasjief.com
1066 1083 10.0.0.133 aksdjie.com
1089 1090 10.0.0.134 klsiejfla.com
1090 1093 10.0.0.135 askjdiev.com
1095 1095 10.0.0.136 jalikej.com
发表于 2004-4-17 00:26:03 | 显示全部楼层
  1. awk '{getline l<"file1";$1=$1" "l;print}' file2
复制代码
发表于 2004-4-17 00:31:06 | 显示全部楼层
最初由 r2007 发表
  1. awk '{getline l<"file1";$1=$1" "l;print}' file2
复制代码

呵呵,还是r2007兄的awk简炼,佩服~~~
 楼主| 发表于 2004-4-17 00:32:45 | 显示全部楼层
嗯,好办法。
发表于 2004-4-17 00:49:00 | 显示全部楼层
sed:
  1. /home/javalee#\
  2. >n=1;while ((n<=$(cat file2|wc -l)));do
  3. >cat file2|sed -n ${n}p|sed "s/\(^[0-9]\{4\}\)/\1 $(sed -n ${n}p file1)/"
  4. >((n+=1))
  5. >done
  6. 1053 1053 10.0.0.128 abcde.com
  7. 1054 1054 10.0.0.129 aaa.com
  8. 1055 1055 10.0.0.130 dkeje.com
  9. 1063 1070 10.0.0.131 jivnmei.com
  10. 1064 1064 10.0.0.132 klasjief.com
  11. 1066 1083 10.0.0.133 aksdjie.com
  12. 1089 1090 10.0.0.134 klsiejfla.com
  13. 1090 1093 10.0.0.135 askjdiev.com
  14. 1095 1095 10.0.0.136 jalikej.com
  15. /home/javalee#
复制代码

ps:请r2007兄指点 :thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表