搜索特定列中另一个文件中字符串的出现

时间:2014-04-16 12:28:36

标签: perl unix

我有两个文件:

1)具有以下内容的选项卡文件。我们称之为参考文件:

    V$HMGIY_01_rc   Ncor=0.405
V$CACD_01   Ncor=0.405
    V$GKLF_02   Ncor=0.650
    V$AML2_Q3   Ncor=0.792
    V$WT1_Q6    Ncor=0.607
V$KID3_01   Ncor=0.668
V$CNOT3_01  Ncor=0.491
    V$KROX_Q6   Ncor=0.423
V$ETF_Q6_rc Ncor=0.547
V$E2F_Q2_rc Ncor=0.653
V$SP1_Q6_01_rc  Ncor=0.650
V$SP4_Q5    Ncor=0.660

2)第二个标签文件包含搜索字符串X,如下所示。我们将此文件称为search_string:

           A                 X
  NF-E2_SC-22827    NF-E2
  NRSF              NRSF
  NFATC1_SC-17834   NFATC1
  NFKB              NFKB
  TCF3_SC-349           TCF3
  MEF2A             MEF2A

我想要做的是:取第一个搜索词(来自search_string文件;列X),检查它是否出现在参考文件的第一列。 示例:第一个搜索词是NF-E2。我需要检查此字符串是否出现在参考文件的第一列中。如果它发生,那么得分为1,否则给0.我还想计算它匹配模式的次数。 我希望输出创建如下:

    X       X in file?  number of times it occurs
    NF-E2          1                            3
    NRSF           0                            0
    NFATC1         0                            0
    NFKB           1                            7
    TCF3           0                            0

请注意:我需要在不同的文件中搜索每个字符串,即第一个字符串(Nf-E2)应该在文件NF-E2.tab中搜索;应在文件NRSF.tab中搜索第二个字符串(NRSF),依此类推。另外,我想仅使用R或Perl脚本对其进行编程。

请帮助!!

1 个答案:

答案 0 :(得分:0)

这是一个单人游戏,您可以玩并改变以适应:

perl -lanE '$str=$F[1];  $f="/home/$str/list/$str.txt"; $c=`grep -c "$str" "$f"`;chomp($c);$x=0;$x++ if $c;say "$str\t$x\t$c"' file2

假设您的第二个文件名为file2。这是我在我的机器上编写的输入文件的一些示例输出:

NF-E2   0   0
NRSF    1   1
NFATC1  1   2
TCF3    1   3
MEF2A   0   0

它只使用grep -c来计算事件并将其存储在变量$c中。 chomp()grep的输出中删除换行符。 $x设置为零,如果计数($c)大于零,则递增。然后使用say打印结果。

我开始使用搜索字符串和要搜索的文件的名称...

$perl -lanE '$str=$F[1];$f=$str.".txt";print "$str $f"' file2
NF-E2 NF-E2.txt
NRSF NRSF.txt
NFATC1 NFATC1.txt
NFKB NFKB.txt
TCF3 TCF3.txt
MEF2A MEF2A.txt

<强>解释

使用的Perl命令行开关:

-l Perl负责为我们节省麻烦的线路结束 - 感谢Perl!

-a将输入文件的字段拆分为名为$F[]

的数组

-n在我们的代码周围设置一个隐含的循环来处理输入文件的每一行(file2)

-E执行单引号内的代码并启用say功能

然后单引号('')中的实际代码...将第二个字段的值(即$F[1]因为字段从0开始)分配给变量$str。分配附加&#34; .txt&#34; $str的值到变量$ f - 这是搜索字符串。然后打印搜索字符串$str和文件名$f

<强> EDITED

如果您发现Bash更容易理解,这是一个Bash版本。

#!/bin/bash

# Set tabs to align output columns
tabs -12

# Output headers
echo -e "X\tPresent?\tCount"

# Extract second column of file2
awk '{print $2}' file2 | while read item
do
   # Work out name of file to search in
   FILE="/home/${item}/list/${item}.txt"

   # Count occurrences of $item in $FILE
   COUNT=$(grep -cw "$item" "$FILE")

   # If COUNT>0 the value is present
   PRESENT=0
   [ $COUNT -gt 0 ] && PRESENT=1

   echo -e "$item\t$PRESENT\t$COUNT"
done

将文件另存为go,然后按以下方式运行:

chmod +x go    # Only necessary for the first run
./go