免费注册 查看新帖 |

Chinaunix

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

初学perl,请教文件关联问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-02 11:23 |只看该作者 |倒序浏览
a.txt:
1|wyw|
2|lxl|

b.txt
1|100|
2|90|

a.txt和b.txt的第1列关联(以|分隔),如果关联到,则输出b.txt的第1、2列及a.txt的第2列到c.txt,即c.txt的内容如下:
c.txt
1|100|wyw|
2|90|lxl|

以前习惯用awk来做:
awk 'BEGIN {
FS = "|"
}
{
        if (NR == FNR)
        {
                arr[$1] = $2
        }
        else
        {
                if ($1 in arr)
                {
                        print $0 arr[$1] "|"  > "c.txt"
                }
        }
}' a.txt b.txt

请教perl如何实现?多谢。

论坛徽章:
0
2 [报告]
发表于 2009-12-02 11:32 |只看该作者
man a2p
........

论坛徽章:
0
3 [报告]
发表于 2009-12-02 11:40 |只看该作者
这个在perl里貌似有几十种做法。
凡人如我会用一个hash去匹配:


# perl -e '               
$f1 = "1|wyw|\n2|lxl|";
$f2 = "1|100|\n2|90|";
%hash1 = map { my @x=split/\|/,$_; $x[0],\@x } split/\n/,$f1;
%hash2 = map { my @x=split/\|/,$_; $x[0],\@x } split/\n/,$f2;
for (keys %hash2 ) {
  $out = join "|", @{$hash2{$_}}, $hash1{$_}->[1];
  print $out . "|", "\n";
}'

1|100|wyw|
2|90|lxl|

论坛徽章:
0
4 [报告]
发表于 2009-12-02 11:52 |只看该作者

回复 #3 兰花仙子 的帖子

多谢DQP及兰花仙子!

to DQP:
我的环境中man a2p可以查到帮助信息,但执行a2p报找不到命令
<77 lan1 [hurh] :/home/hurh/wyw2>a2p
/usr/bin/sh/a2p: Not a directory.

to 兰花仙子
用perl实现貌似很复杂,还不太好懂(对像我这样的初学者来说)
awk的方法我感觉很简单,清晰,perl中有没有逻辑上比较简单的方法,不用关注技巧,性能等问题,只需要好懂。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2009-12-02 13:14 |只看该作者

回复 #4 w61655 的帖子

  1. perl -F'\|' -lane 'if($#ARGV==0){$h{$F[0]}=$F[1]}else{print "$_$h{$F[0]}|"}' a.txt b.txt > c.txt
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-12-02 19:09 |只看该作者
原帖由 ly5066113 于 2009-12-2 13:14 发表
perl -F'\|' -lane 'if($#ARGV==0){$h{$F[0]}=$F[1]}else{print "$_$h{$F[0]}|"}' a.txt b.txt > c.txt


good!
C:\>perl -F"\|" -lane "$#ARGV==0?$h{$F[0]}=$F[1]:print(qq($_|$h{$F[0]}))" b.txt a.txt >c.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP