免费注册 查看新帖 |

Chinaunix

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

如何在perl中同时打开两个文件,将两个文件对应行的数据进行处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-10 17:17 |只看该作者 |倒序浏览
文件1:
wav/wanyanbo/near/001.wav  [812,4282]  [1267,1429]  [1819,2027]  [2442,2648]  [3044,3283]  [3688,4024]
wav/wanyanbo/near/002.wav  [737,4076]  [1160,1312]  [1698,1866]  [2256,2439]  [2838,3158]  [3578,3827]
wav/wanyanbo/near/003.wav  [758,4510]  [1120,1302]  [1738,2093]  [2473,2838]  [3213,3623]  [3994,4221]
wav/wanyanbo/near/004.wav  [744,4100]  [1160,1387]  [1776,1996]  [2377,2664]  [3004,3171]  [3564,3885]
wav/wanyanbo/near/005.wav  [692,4330]  [1105,1353]  [1771,1948]  [2322,2597]  [3040,3371]  [3756,4141]
wav/wanyanbo/near/006.wav  [743,4358]  [1185,1526]  [2018,2430]  [2815,3023]  [3439,3620]  [4009,4138]
wav/wanyanbo/near/007.wav  [746,4633]  [1119,1550]  [2042,2356]  [2769,3007]  [3366,3508]  [3922,4403]
wav/wanyanbo/near/008.wav  [713,4592]  [1093,1528]  [1991,2131]  [2559,2934]  [3317,3723]  [4136,4334]
wav/wanyanbo/near/009.wav  [768,4706]  [1133,1441]  [1815,2084]  [2479,2901]  [3344,3701]  [4117,4473]
wav/wanyanbo/near/010.wav  [741,4466]  [1156,1609]  [2048,2216]  [2643,2851]  [3308,3436]  [3870,4107]
文件2(下面的数据只是举例,没有规律):
100
200
300
400
500
600
700
800
900
1000
现要将文件1每一行中第一个方括号[]内的第二个数字减去文件2对应行的数字,并将取得的数字替换掉第一个方括号的第一个数字。例子如下:
文件1第1行第一个方括号:[812,4282]   文件2第1行:100  
4282-100=4182
则文件1第一行第一个方括号变为:[4312,4282]
文件1第2行第一个方括号:[737,4076]    文件2第2行:200  
4076-200=3876
则文件1第一行第一个方括号变为:[3876,4076]
.
.
.
以此类推
在linux下命令行下可以这样吗    perl findStart.pl file1 file2 > file3      #file3代表替换后得到的新文件
  1. #!/user/bin/perl

  2. open (IN1, $ARGV[0]);    #命令行中在perl文件后输入的第一个参数,代表文件1

  3. open (IN2, $ARGV[1]);    #命令行中在perl文件后输入的第二个参数,代表第文件2

  4. while ($LINE1 = <IN1>, $LINE2 = <IN2>)  #每次读入文件1和文件2中的一行
  5. {
  6.         chomp ($LINE1);   #去掉行末尾的换行符

  7.         chomp ($LINE2);

  8.         @parts1 = split (/\s+/, $LINE1);  #以空格为分隔符分割文件1中的一行得到数组

  9.         $temp = $parts1[1];

  10.         $temp =~ s/\[//;  #去掉[

  11.         $temp =~ s/\]//;

  12.         @parts2 = split (/,/, $temp);  #以,为分割符分割文件1某行第一个方括号内的两个数组

  13.         $num1 = $parts2[1] - $LINE2;  #将文件1某行第一个方括号内第二个数字减去文件2对应行的数字

  14.         $NEWLINE = $parts1[0]."  [".$num1.",".$parts2[1]."]" ;  

  15.         for ($i = 2; $i <= $#parts1; $i++)  # $#parts1为数组@parts1最后一个元素的下标
  16.         {
  17.                 $NEWLINE = $NEWLINE."  ".$parts1[$i];
  18.         }


  19.         print $NEWLINE."/n"; #打印出替换第一个方括号第一个数字后的行



  20. }
  21. close (IN2);

  22. close (IN1);
复制代码

论坛徽章:
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
2 [报告]
发表于 2016-05-10 18:08 |只看该作者
回复 1# 南宫慕容007
你是想说啥

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2016-05-10 18:14 |只看该作者
先用 paste 合并成一个文件。 之后就是一个文件中的操作了。

要不然, awk 应该也行。

论坛徽章:
0
4 [报告]
发表于 2016-05-10 18:44 |只看该作者
就是有两个文件,想用第一个文件某个位置的数字减第二个文件的数字,这两个文件的行数是相等的回复 2# sunzhiguolu


   

论坛徽章:
0
5 [报告]
发表于 2016-05-10 18:45 |只看该作者
while里面不能同时放两个文件是吗回复 3# q1208c


   

论坛徽章:
0
6 [报告]
发表于 2016-05-10 18:57 |只看该作者
比如说
文件1格式:
100 200 300
400 500 600
文件2格式:
100
200
现在要用文件1每一行第一个减去文件2对应行,得到
0 200 300
200 500 600
能在一个perl文件里面做到吗?例如
while($LINE1 = <文件1>, $LINE2 = <文件2>)
{
          相应操作
  }
回复 2# sunzhiguolu


   

论坛徽章:
0
7 [报告]
发表于 2016-05-10 19:00 |只看该作者
如果合成了一个文件,那么怎么确定是哪一行减哪一行回复 3# q1208c


   

论坛徽章:
0
8 [报告]
发表于 2016-05-10 19:06 |只看该作者
其实我的意思就是能不能对两个文件同时打开进行操作,而不需要把这两个文件合成一个文件再进行操作回复 2# sunzhiguolu


   

论坛徽章:
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
9 [报告]
发表于 2016-05-10 19:16 |只看该作者
回复 8# 南宫慕容007

  1. while (my $sA = <IN1>){
  2.     my $sB = <IN2>;
  3.     #...
  4. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2016-05-10 19:27 |只看该作者
那我上面的代码只要把$LINE2 = <IN2>挪到while后面的{}里面就行了吧,但是这样能确保$LINE1是指向文件1的第n行时,$LINE2也是指向文件2的第n行吗回复 9# sunzhiguolu


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP