Perl 转置模式搜索

Perl 转置模式搜索,perl,awk,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

我有一个格式为的文本文件

  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

类似的东西可能会起作用:

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";
  }
}
使用警告;
严格使用;
我的%col11_13;
#读取文件
my@lines=map{chomp;[split,$\uz]};
#在第一个过程中准备哈希
对于我的$i(0..@lines-1){
推送({$col11_13{$lines[$i][10]。“|”。$lines[$i][12]},$i+1);
}
#输出在第二个。。。
对于我的$i(0..@lines-1){
#获取匹配记录的列表,但筛选出自匹配记录
我的@s=grep{$\!=$i+1}{$col11_13{$lines[$i][12]。“|”。$lines[$i][10]};
如果(@s){
打印$Line[$i][13],“#Line”,join(“,@s),“\n”;
}否则{
打印$行[$i][13],“\n”;
}
}

到目前为止,您尝试了什么?显示代码。所以这不是一个“为我编写代码”的网站。@JimGarrison对此表示抱歉。我来自非技术背景。我正在尝试awk'{(I=1;iWorks完美!非常感谢perreal。如何修改您的代码,使其仅在第11列和第13列的非零值上运行。(例如,如何忽略我的原始示例的第2行?)。谢谢。更改推送方式:
推送(@{$col11_13{$lines[$I][10]。“|”。$lines[$I][12]},$I+1)if($lines[$I][10]&$lines[$I][12])
哇!你真是个天才。谢谢。你回答中的
grep
在做什么?看起来它试图阻止一行匹配本身,但我花了一点时间才弄明白。这里的注释可能有用。