转置模式搜索

时间:2013-03-07 07:18:12

标签: perl awk

我有格式为

的文本文件
  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

这是NMR光谱数据。非常感谢您的帮助。 谢谢 -mandar

1 个答案:

答案 0 :(得分: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";
  }
}