我有两个文件:
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脚本对其进行编程。
请帮助!!
答案 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