免费注册 查看新帖 |

Chinaunix

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

文件之间的替换 [复制链接]

论坛徽章:
0
发表于 2011-05-11 14:44 |显示全部楼层
1.txt是名称文件
2.txt是“名称 + 内容”文件

想把2.txt中所有的包含1.txt名称的行都找出来。
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $a="2.txt";
  4. my $b="1.txt";
  5. open IN1, $a or die "can't open $a";
  6. open IN2, $b or die "can't open $b";
  7. open OUT, '>>', "out.txt" or die "can't open out.txt";

  8. my @data = <IN1>;
  9. my @names = <IN2>;
  10. foreach my $i (0..$#data){
  11.                  my @line2 = split(/\s+/,$data[$i]);
  12.                  my $name1 = shift @names;
  13.                  my $name2 = shift @line2;
  14.                  if ($name1 eq $name2){
  15.                 print OUT $data[$i];
  16.               }
  17.             }
  18. close IN1;
  19. close IN2;
  20. close OUT;
复制代码
哪里不对啦

论坛徽章:
0
发表于 2011-05-11 14:46 |显示全部楼层
举几个例子吧。。

文件内容
期待结果啥的

论坛徽章:
0
发表于 2011-05-11 14:53 |显示全部楼层
回复 2# Cu_fans


    例如,
1.txt中
song
zhang
wang
...


2.txt中
guan 135 658 687
song 214 354 547
zhang 264 364 784
xie 123 541 589
wang 201 265 847
han 021 521 854
...

得到 out.txt
song 214 354 547
zhang 264 364 784
wang 201 265 847
...

论坛徽章:
0
发表于 2011-05-11 15:00 |显示全部楼层
grep -f 1.txt 2.txt 就出来了

论坛徽章:
0
发表于 2011-05-11 15:05 |显示全部楼层
本帖最后由 xingzhou823 于 2011-05-11 15:14 编辑

回复 4# Cu_fans


    can't open perl script grep:No such file or directory .
是什么意思?

grep 函数我不会用

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-05-11 15:41 |显示全部楼层
回复 1# xingzhou823
  1. perl -lane 'if($#F==0){$a{$F[0]}=1}if($#F>0&&$a{$F[0]}){print $_}' 1.txt 2.txt
  2. song 214 354 547
  3. zhang 264 364 784
  4. wang 201 265 847
复制代码

论坛徽章:
0
发表于 2011-05-11 15:51 |显示全部楼层
回复 6# yinyuemi


    太复杂了,
可是我试了一下

can't find string terminator "'" anywhere befor EOF at -e line 1.

什么意思?

论坛徽章:
0
发表于 2011-05-11 16:11 |显示全部楼层
回复  Cu_fans


    can't open perl script grep:No such file or directory .
是什么意思?

gr ...
xingzhou823 发表于 2011-05-11 15:05



shell下的grep 命令

论坛徽章:
0
发表于 2011-05-11 16:12 |显示全部楼层
你的源程序存在点逻辑问题。。 在你的基础上稍微修改了下,应该能满足
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $a="2.txt";
  4. my $b="1.txt";
  5. open IN1, $a or die "can't open $a";
  6. open IN2, $b or die "can't open $b";
  7. open OUT, '>', "out.txt" or die "can't open out.txt";

  8. my @data = <IN1>;

  9. sub func
  10. {
  11.         my ($str, @arr) = @_;
  12.         for (my $i=0; $i<=$#arr; ++$i)
  13.         {
  14.                 chomp($arr[$i]);
  15.                 if ($str eq $arr[$i])
  16.                 {
  17.                         return 1;
  18.                 }
  19.         }
  20.        
  21.         return 0;
  22. }

  23. my @names = <IN2>;
  24. foreach my $i (0..$#data){
  25.                  my @line2 = split(/\s+/,$data[$i]);
  26.                  my $name2 = shift @line2;
  27.                  print "name2:", $name2,"\n";
  28.                  if (func($name2, @names))
  29.                  {
  30.                         print OUT $data[$i];
  31.                        }
  32.             }       
  33. close IN1;
  34. close IN2;
  35. close OUT;
复制代码

论坛徽章:
0
发表于 2011-05-11 16:14 |显示全部楼层
回复 8# Cu_fans


    我不懂这个。
麻烦你还是给我修改一下我那个吧,先让我过了这关,卡在这好难受啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP