如果字符串匹配,则仅打印'+'或' - '(两个文件)

时间:2014-02-27 10:05:09

标签: regex perl parsing awk

如果找到或不找到字符串,我想只打印'+'o' - '符号。基本上,我有两个文件:

输入文件1(制表符分隔):

HPNK_00457
HPNK_00458
HPNK_00459

输入文件2(制表符分隔):

HPNK_00457  AAA50325    1e-43   437 28  43  83  ATP-binding protein.
HPNK_00458  P25256  8e-43   429 28  43  82  RecName: Full=Tylosin resistance ATP-binding protein tlrC.
HPNK_00458  CAM96590    1e-42   429 27  42  87  ABC transporter ATP-binding protein [Streptomyces ambofaciens].

所需的输出(制表符分隔,维护文件1中字符串的顺序):

HPNK_00457 +
HPNK_00458 +
HPNK_00459 -

这是我一直在使用的,但需要更新:

while read vl; do grep "^$vl      " file2 || printf -- "- -\n" ; done < file1

谢谢,试着每天都在这里学习。

6 个答案:

答案 0 :(得分:6)

这是使用awk的一种方式:

awk 'FNR==NR { a[$1]; next } { print $1, ($1 in a ? "+" : "-" ) }' file2 file1 

结果:

HPNK_00457 +
HPNK_00458 +
HPNK_00459 -

答案 1 :(得分:2)

您可以使用:

while read -r line
do
    grep -q "$line" f2 && echo "$line +" || echo "$line -"
done < f1

如果grep -q匹配某些内容,则只返回true,在这种情况下,我们会打印文件名+ +,否则,我们会打印文件名+ -

它返回:

$ while read -r line; do grep -q "$line" f2 && echo "$line +" || echo "$line -"; done < f1
HPNK_00457 +
HPNK_00458 +
HPNK_00459 -

答案 2 :(得分:2)

perl -lane'
  BEGIN{ $, ="\t"; $x=shift; @h{ map /(\S+)/, <> } =(); @ARGV=$x }
  print @F, exists $h{$F[0]} ? "+" : "-";
' file1 file2

输出

HPNK_00457      +
HPNK_00458      +
HPNK_00459      -

答案 3 :(得分:1)

这是算法:

  1. 读取文件2.对于每一行,
  2. 获取第一个字
  3. 将其存储在哈希值中。
  4. 读取文件1.对于每一行,选择它,然后
  5. print $ hash {$ _}? '+':' - '
  6. 我可以为你编写代码,但如果你想每天学习,如果你想自己写一下这将是一个有用的练习。

答案 4 :(得分:1)

这个简单的Perl脚本应该完成工作

#!/usr/local/bin/perl
## f1 and f2 are the 2 files containing your input data
open FILE1, f1;
open FILE2, f2;

@file1data = <FILE1>;
@file2data = <FILE2>;

my $row = 0;
foreach $data (@file1data) {
        chomp($data);
        if (grep (/$data/,$file2data[$row]) ) {
                print $data . " " . "+\n";
        }
        else {
                print $data . " " . "-\n";
        }
        $row++;
}

答案 5 :(得分:0)

awk 'FNR==NR
     {a[$1];next}
     {b[$1]}
     END{
     for(i in a)
     if(b[i]){print i,"+"}
     else{print i,"-"}
     }' file1 file2