【问题标题】:perl input from 2 text files to make one text fileperl 从 2 个文本文件输入以生成一个文本文件
【发布时间】:2010-08-10 23:51:48
【问题描述】:

我有一个文本文件(fileA),大约 200 行,每一行都有格式

afield1 afield2 afield3 afield4 afield5

和另一个文本文件(fileB),大约 300 行,格式相同

bfield1 bfield2 bfield3 bfield4 bfield5

我想创建另一个文本文件,如果 afield1 & bfield1 匹配,它会写一行:

"some text" bfield4 "some text" afield3 "some text" afield1

如果我知道怎么做的话,我认为这在 perl 甚至 awk 中会很容易做到。事实证明,一个简单的 shell 脚本非常困难。

非常感谢收到的任何帮助。

谢谢

【问题讨论】:

  • 不清楚你的意思是什么:“如果字段匹配,它将跳过该行。”

标签: perl awk


【解决方案1】:

好吧,使用某些模块可能会更容易,但由于您似乎需要一些快速而肮脏的东西,这就是我能想到的。 (这假设您的文件由逗号分隔。如果您使用其他内容,请更改拆分调用中的分隔符。

open(my $fh1, "fileA.txt") or die $!;
open(my $fh2, "fileB.txt") or die $!;
open( my $out, ">outfile.txt") or die $!;
while( my $line = <$fh2> ) {
     chomp($line);
     my @columns_2 = split(/,/, $line);
     my $a_line = <$fh1>;
     my @columns_1 = split(/,/, $a_line);

     if( $columns_2[0] eq $columns_1[0] ) {
          print $out "text $columns_2[3] more text $columns_1[2] more text $columns_1[0]\n";
     }
}
close($fh1);
close($fh2);
close($out);

【讨论】:

  • except 对我不起作用 - 希望我可以调试 - 在第 2 行不断出现 Can't use an undefined value as filehandle reference
  • 嗯...什么版本的 perl?
  • perl5 (5.0 patchlevel 5 subversion 3)
【解决方案2】:
awk 'FNR==NR{a[$1];next}($1 in a) {print "sometext "$4" some text blah"} ' file1 file2

给出一个更具体的数据文件示例以及下一次的预期输出。

【讨论】:

    【解决方案3】:

    在 Bash 中:

    join <(sort fileA) <(sort fileB) | awk '{print $8, "some text", $3, "some text", $1}'
    

    如果您不使用 Bash,则可能需要对文件进行预排序。

    sort fileA > temp1
    sort fileA > temp2
    join temp1 temp2 | awk '{print $8, "some text", $3, "some text", $1}'
    

    【讨论】:

      【解决方案4】:

      以 ghostdog74 的回答为基础

      awk '
          # read file1 first
          FNR == NR {
              # store afield3 for later
              a[$1] = $3 
              next
          }
          ($1 in a) {
              # bfield1 == some afield1
              print "some text " $4 " some text " a[$1] " some text " $1
          } 
      ' file1 file2
      

      【讨论】:

      • 谢谢 - 假设 afield1 只出现一次,但 bfield1 可能在 fileB 中出现几次 - 我只想在第一次匹配时打印该行?
      • @paul44,然后是 delete a[$1] 在 print 语句之后
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多