如果找到或不找到字符串,我想只打印'+'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
谢谢,试着每天都在这里学习。
答案 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)
这是算法:
我可以为你编写代码,但如果你想每天学习,如果你想自己写一下这将是一个有用的练习。
答案 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