免费注册 查看新帖 |

Chinaunix

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

【已解决】查找匹配并输出的问题 [复制链接]

论坛徽章:
0
发表于 2016-07-19 19:45 |显示全部楼层
本帖最后由 smile1129 于 2016-07-20 12:36 编辑

在1.txt中有两列数据(:分隔),如下:
S0000001:19870301
S0000002:19870302
S0000005:19870305
S0000006:19870306
S0000007:19870307
S0000008:19870308
....

2.txt 中为我要精确查询的信息,希望得到匹配的第2列信息。

S0000001
S0000002
S0000003
S0000004
S0000005


我想得到的是输出文件3.txt,内容如下(没查找到用空行):
19870301
19870302


19870305



论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-07-19 21:37 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-07-19 21:44 编辑

试下,
  1. perl -F/:/ -nle 'if(@ARGV){$h{$F[0]}=$F[-1];next}exists $h{$_} ? print("$h{$_}") : print("")' a b
复制代码
19870301
19870302




19870305

评分

参与人数 1信誉积分 +5 收起 理由
smile1129 + 5 谢谢大神!

查看全部评分

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-07-19 23:16 |显示全部楼层
回复 1# smile1129

$ awk -F: 'FNR==NR{a[$1]=$2;next}{print a[$1]}' 1.txt 2.txt
19870301
19870302


19870305

   

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-07-20 01:29 |显示全部楼层
学习了,谢谢大神指点。

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-07-20 01:43 |显示全部楼层
$>  for i in `cat 2.txt`; do echo `grep $i 1.txt|cut -f2 -d:` ; done
19870301
19870302


19870305

论坛徽章:
0
发表于 2016-07-20 11:15 |显示全部楼层
sunzhiguolu 发表于 2016-07-19 21:37
试下,19870301
19870302
  1. perl -F/:/ -nle 'if(@ARGV){$h{$F[0]}=$F[-1];next}exists $h{$_} ? print("$h{$_}") : print("")' a b
复制代码
(我用的Windows系统,安装的activeperl)
请问大侠,这个能不能写为一个perl.pl文件(方便我使用,而且数据量较大,命令行我这不方便),输入文件名为1.txt,  2.txt,  输出文件为3.txt ,  不甚感激!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-07-20 11:41 |显示全部楼层
本帖最后由 jason680 于 2016-07-20 11:43 编辑

回复 6# smile1129

C:\>perl get_id.pl
Usage  : perl get_id.pl FILE_TABLE FILE_ID
Example: perl get_id.pl 1.txt      2.txt

C:\>perl get_id.pl 1.txt 2.txt > 3.txt


C:\>type 3.txt
19870301
19870302


19870305

C:\>type get_id.pl
use strict;
use warnings;

sub message{
  print <<EOF;
Usage  : perl $0 FILE_TABLE FILE_ID
Example: perl $0 1.txt      2.txt

EOF

  print "@_" if @_;
  exit 2;
}

message() if (@ARGV !=2);

my($sFtb, $sFid) = @ARGV;

open(FHtb, "<", "$sFtb") or die "cannot open $sFtb\n";
open(FHid, "<", "$sFid") or die "cannot open $sFid\n";

my %hTb;
while(<FHtb>){
  chomp;
  my($sID, $sVal) = split(":");
  $hTb{$sID} = $sVal;
}

while(<FHid>){
  chomp;
  my $sOut = $hTb{$_} // "";
  print "$sOut\n";
}

   

评分

参与人数 1信誉积分 +5 收起 理由
smile1129 + 5 很给力!谢谢大神!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-07-20 11:55 |显示全部楼层
回复 6# smile1129

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my ($urPath, %hKeys) = './c';

  5. open (my $fhW, '>', $urPath);
  6. select ($fhW);
  7. while (<>){
  8.     if (@ARGV){
  9.         my ($k, $v) = split /:/;
  10.         $hKeys{$k} = $v;
  11.         next;
  12.     }
  13.     print $hKeys{$_} // "\n" if (s/\s+\z//);
  14. }
  15. close ($fhW);
复制代码
perl abc.pl a b
cat c
-----------------------------------------
19870301
19870302


19870305


   

论坛徽章:
0
发表于 2016-07-20 12:13 |显示全部楼层
回复 8# sunzhiguolu


    谢谢大神,搞定啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP