免费注册 查看新帖 |

Chinaunix

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

急求教:二个文件按一字段值进行合并 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-17 11:43 |只看该作者 |倒序浏览
有二个文件A,B
A:
   1      2     3      4 5
  aaa|kkk|Nokia|2|4
  fffa|kfdsk|Nokia2101|1|4
  sd|fdfdsk|Motoloa100|2|1
  vc|1234|Alcatel100|2|1
  m|fdxvdsk|Motoloa200|2|1
...
...

B:
  Nokia           1
  Nokia2101   2
  Nokia300     3
  Motoloa200  4
  Alcatel100    5
  unkown        6

现在将A中第3字段(手机名)用B中第二个字段代替,条件是:A的第3字段=B第1字段

如上A替换后应该是:
   1     2    3      4 5
  aaa|kkk  |1|2|4
  fffa|kfdsk|2|1|4
  sd|fdfdsk|6|2|1
  vc|1234  |5|2|1
  m|fdxvdsk|4|2|1
...
在线急等,非常感谢

论坛徽章:
0
2 [报告]
发表于 2007-01-17 12:17 |只看该作者
awk 'OFS="|"{print $1,$2}' b>c
awk -F\| 'BEGIN{OFS="|"} NR <= FNR {hash[$1] = $2} NR > FNR {print $1,$2,hash[$3],$4,$5}' c a

论坛徽章:
0
3 [报告]
发表于 2007-01-17 12:38 |只看该作者
原帖由 wyting 于 2007-1-17 12:17 发表
awk 'OFS="|"{print $1,$2}' b>c
awk -F\| 'BEGIN{OFS="|"} NR <= FNR {hash[$1] = $2} NR > FNR {print $1,$2,hash[$3],$4,$5}' c a



兄弟,好象不行嘛?
结果:
aaa|kkk||2|4
fffa|kfdsk||1|4
sd|fdfdsk||2|1
vc|1234||2|1
m|fdxvdsk||2|1

一个也没匹配上

论坛徽章:
0
4 [报告]
发表于 2007-01-17 12:52 |只看该作者
b.txt是B哈...
PS: 是unknow....

  1. #!/bin/sh

  2. awk 'BEGIN {
  3. while (getline < "b.txt")
  4.     hash[$1] = $2;
  5. FS = "|";
  6. OFS = "|";
  7. }
  8. {
  9.     if (hash[$3] == "")
  10.         $3 = hash["unknow"];
  11.     else
  12.         $3 = hash[$3];
  13.     print;
  14. }' a.txt
复制代码


结果

  1. Administrator@TMA ~
  2. $ ./merge.sh
  3.   aaa|kkk|1|2|4
  4.   fffa|kfdsk|2|1|4
  5.   sd|fdfdsk|6|2|1
  6.   vc|1234|5|2|1
  7.   m|fdxvdsk|4|2|1
复制代码

论坛徽章:
0
5 [报告]
发表于 2007-01-17 14:51 |只看该作者
Eden:
  我用你脚本执行时,怎么停止不动???
出不了结果?

论坛徽章:
0
6 [报告]
发表于 2007-01-17 14:54 |只看该作者
原帖由 taocb006 于 2007-1-17 14:51 发表
Eden:
  我用你脚本执行时,怎么停止不动???
出不了结果?


b.txt代表映射表, a.txt是用|分割的文件...

如果你的b.txt不存在可能就会停止不动.

论坛徽章:
0
7 [报告]
发表于 2007-01-17 15:10 |只看该作者
二个文件都在呀,可就是不执行??
#ls
a.txt  aa.sh  b.txt
#more aa.sh
#!/bin/sh


awk 'BEGIN{
  while (getline < "b.txt")
    hash[$1]=$2;
FS="|";
OFS="|"
}
{
if (hash[$3] == "")
       $3 = hash["unkown"];
  else
  $3 = hash[$3];
print $0;
}' a.txt


#more a.txt
aaa|kkk|Nokia|2|4
fffa|kfdsk|Nokia2101|1|4
sd|fdfdsk|Motoloa100|2|1
vc|1234|Alcatel100|2|1
m|fdxvdsk|Motoloa200|2|1


#more b.txt
Nokia       1
Nokia2101   2
Nokia300    3
Motoloa200  4
Alcatel100    5
unkown        6


?????

论坛徽章:
0
8 [报告]
发表于 2007-01-17 15:38 |只看该作者
知道原因了: getline<"b.txt"中的b.txt需要绝对路径,谢谢
我先测试一下

论坛徽章:
0
9 [报告]
发表于 2007-01-17 15:46 |只看该作者
  1. awk -F '|' '
  2. BEGIN { OFS=FS; }
  3. FILENAME == "file1" {
  4.         split($0, arr, " ");
  5.         key[arr[1]] = arr[2];
  6. }
  7. FILENAME == "file2" {
  8.         $3 = key[$3] ? key[$3] : $3;
  9.         print;
  10. }
  11. ' file1 file2
复制代码

论坛徽章:
0
10 [报告]
发表于 2007-01-17 16:48 |只看该作者
  1. join -t"|" -j1 3 -j2 1 -o 1.1 1.2 2.2 1.4 1.5 <(sort -t"|" -k3,3 A) <(sed 's/ \+/|/g' B|sort -t"|" -k1,1)
复制代码


Eden兄受awk兄的影响颇深阿~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP