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 

……

我想确定第 11 列与第 13 列匹配且第 13 列与任何其他行(例如第 1 行和第 4 行)的第 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

这是核磁共振光谱数据。非常感谢您的帮助。谢谢你-mandar

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 回答