如何使用Perl将一个文件的列替换为另一个文件的列?

时间:2009-10-23 06:36:51

标签: perl

假设文件1有两列,看起来像:

fuzz          n.  flowering shrub of the rhododendron family
dyspeptic     adj. bright blue, as of the sky 
dysplexi      adj. of Byzantium or the E Roman Empire
eyrie         adj. of the Czech Republic or Bohemia
azalea        adj. suffering from dyslexia
Czech         adj. suffering from dyspepsia
Byzantine     n. eagle's nest
azure         n. mass of soft light particle

文件2只有一个clumn,看起来像:

azalea
azure
Byzantine
Czech
dyslexic
dyspeptic
eyrie
fuzz

我希望将文件1的第一列替换为文件2的列。因此,文件3应如下所示:

azalea        n.  flowering shrub of the rhododendron family
azure         adj. bright blue, as of the sky 
Byzantine     adj. of Byzantium or the E Roman Empire
Czech         adj. of the Czech Republic or Bohemia
dyslexic      adj. suffering from dyslexia
dyspeptic     adj. suffering from dyspepsia
eyrie         n. eagle's nest
fuzz          n. mass of soft light particle

我有一种感觉,就是有一种或另一种简单的方法可以做这种工作而且它很可能是一些方便的模块,但是现在我甚至不能以最低效的方式做到这一点。我尝试了一堆像

这样的代码
while<$line1 = file1>{
while<$line2 = file2>{
join $line,$line2 

但没有运气。有人能指出我正确的方向吗?一如既往地感谢任何指导。

4 个答案:

答案 0 :(得分:6)

如果您想同时阅读两行,请尝试以下操作:

while(defined(my $line1 = <file1>)
      and defined(my $line2 = <file2>)) {
  # replace contents in $line1 with $line2 and do something with $line1
}

一旦一行耗尽,这将停止工作,因此在此循环结束时查看两个文件是否为空可能是个好主意:

die "Files are different sizes!\n" unless eof(file1) == eof(file2);

当然,在现代Perl中,您可以将文件句柄存储在词法范围的变量中,如下所示:

open my $fh, ...

然后用漂亮的词法范围<FILEHANDLES>替换丑陋的全局<$filehandles>。它更好,而且它使

答案 1 :(得分:4)

我读这个,因为你想输出第一个文件,排序方式与第二个文件类似。重新阅读后,您似乎只想更换列,而不更改顺序。假设您可以处理打开文件,这是解决方案。

while(($line1 = <FILE1>) && ($line2 =  <FILE2>)){
  chomp $line2;
  $line1 =~ s/^\w+/$line2/;
  print FILE3 $line1;
}

这是我的原始解决方案,按照它们在第二个文件中出现的顺序对条目进行排序。

创建文件1的哈希。

$dictionary = {}
while (<FILE1>){
  m/^(\w+)\s+(.*)$/;
  $dictionary{$1}=$2;
}

查找文件2中每个键的定义并打印连接线

while (<FILE2>){     
  $key =~ s/\s*//g;
  print FILE3 "$key\t\t$dictionary{$key}\n";
}

答案 2 :(得分:4)

以小步骤思考你想做什么。

  • 从每个文件中读取一行。
  • 文件1有两列,因此将其拆分为两列。
  • 现在你有一行来自文件1(分为两部分),还有一行来自文件2。
  • 打印要保留的部分:文件1的第一部分和文件2中的部分。

然后你继续这样做,直到你从一个文件或另一个文件用尽线。

以下是您需要的部分内容:

  • 打开文件:open(my $filehandle, '<', 'filename') or die "Can't open filename";
  • 阅读一行:my $line = <$filehandle>;
  • 将其拆分为两列:有很多方法可以执行此操作 - 使用正则表达式,或split(),甚至substr()
  • 打印出一行:非常简单
  • 如果你的线路用完了,你就完成了:exit if !$line;

答案 3 :(得分:0)

您可以在* nix上使用“cut -c 10- file1 | paste file2 - ”。