2

次の形式のテキストファイルがあります

  1   5.287  15.026   0.623 1 U   1.805E+05  0.000E+00 e 0   666   761   769 
  2   4.601  15.023   0.623 4 U   6.220E+04  0.000E+00 e 0     0     0     0 
  3   2.883  15.059   0.623 3 U   3.303E+05  0.000E+00 e 0   680   761   769 
  4   0.623  56.340   5.287 3 U   9.990E+04  0.000E+00 e 0   769   590   666 

...。

他の行(たとえば、行1と行4)の列11が列13と一致し、列13が列11と一致する行を識別したいと思います。両方の行の最後にコメントを追加して、ファイル全体を印刷したいと思います。

  1   5.287  15.026   0.623 1 U   1.805E+05  0.000E+00 e 0   666   761   769   #Line 4
  2   4.601  15.023   0.623 4 U   6.220E+04  0.000E+00 e 0     0     0     0 
  3   2.883  15.059   0.623 3 U   3.303E+05  0.000E+00 e 0   680   761   769 
  4   0.623  56.340   5.287 3 U   9.990E+04  0.000E+00 e 0   769   590   666   #Line 1

これはNMR分光法のデータです。どうぞよろしくお願いいたします。ありがとう-マンダー

4

1 に答える 1

1

このようなものが機能する可能性があります:

use warnings;
use strict;

my %col11_13;

# read file
my @lines = map { chomp; [ split, $_] } <>; 

# prepare hash in the first pass
for my $i (0..@lines - 1) {
  push (@{$col11_13{$lines[$i][10]."|".$lines[$i][12]}}, $i + 1); 
}

# output in the second...
for my $i (0..@lines - 1) {
  # get the list of matching records, but filter out a self match
  my @s = grep { $_ != $i + 1 } @{$col11_13{$lines[$i][12]."|".$lines[$i][10]}};
  if (@s) {
    print $lines[$i][13], "# Line ", join(" ", @s) ,"\n";
  } else {
    print $lines[$i][13], "\n";
  }
}
于 2013-03-07T07:38:40.853 に答える