在shell脚本中使用awk / grep搜索文本

时间:2013-04-29 15:23:40

标签: awk grep

我正在搜索/匹配源文件sourcefile.txt中的术语列表与目标文件target.bed中的术语列表。我想将grep'd术语及其相应的距离值打印到单独的输出文件中。

源文件如下所示:

SMOX
NCOA3
EHF

目标文件如下所示:

Chromosome PeakStart PeakEnd Distance GeneStart GeneEnd ClosestTSS_ID   Symbol  Strand
chr20 4100204 4100378 -29134 4129425 4168394 SMOX null +
chr20 6234586 46234754 -21075 46255745 46257534 NCOA3 null +
chr11 34622044 34622238 -20498 34642639 34668098 EHF >null +

包含grep'd文本(ClosestTSS_ID和Distance)

的输出文件
SMOX -29134
NCOA -21075
EHF -20498

我试过这个剧本:

exec < sourcefile.txt
while read line
do
genes=$(echo $line| awk '{print $1}')
grep -w "genes" targetfile.bed | awk '{print $4,$7}' >> outputfile.txt
done`

但它对我的不同源文件不起作用;我想在同一个循环中包含许多不同的源文件,但脚本仅适用于第一个。我使用了相同的脚本但文件名不同。

我也试过这个:

rm sourcefile_temp.txt
touch sourcefile_temp.txt
awk 'NR>1{print $1}' sourcefile.txt > sourcefile_temp.txt
exec < sourcefile_temp.txt
while read line
do
set $line
sourcefilevar=`grep $1 targetfile.bed| cut -f4| cut -f7`
echo $line $tssmoq2 >> output.txt
done`

这个给了我一个非常奇怪的输出。

任何建议/更正/更好的方法都会非常感激。

1 个答案:

答案 0 :(得分:2)

这个awk脚本将完成这项工作:

$ awk 'FNR==NR{a[$1];next}FNR>1&&($7 in a){print $7,$4}' source target
SMOX -29134
NCOA3 -21075
EHF -20498