使用单个命令 grep 20000 个字符串

使用单个命令 grep 20000 个字符串

这是第一个输入 - 其中包含 20000 个字符串。

X   10063445    10098579    X:10063445|10098579 
X   101020487   101021315   X:101020487|101021315   
X   101041317   101042312   X:101041317|101042312   
X   101120402   101120784   X:101120402|101120784   
X   101126709   101148161   X:101126709|101148161   
X   107088436   107088839   X:107088436|107088839   
X   110020352   110067396   X:110020352|110067396

第二个输入文件-

X   10063445    10098579    2
X   11055936    11110981    2
X   13666317    13680598    5
X   14843660    14859334    13
X   14850505    14859334    5
X   16818574    16829770    2
X   19541925    19546050    4
X   19683823    19695741    4
X   19965044    19970298    2
X   20188497    20204103    2
X   24073601    24074959    11
X   24172715    24179770    9
X   24179183    24179770    2
X   24540246    24546477    2
X   24809898    24843677    4
X   24809898    24888122    3
X   38666121    38687674    2
X   44524002    44527365    8
X   45010961    45020730    3
X   45010961    45037689    2
X   46984884    46998277    2
X   47222261    47228644    2

到目前为止,我使用 bedtools intersect 来对两个文件进行相交,但它仅给出相交的结果,并且我也希望在同一结果文件中不相交。我使用命令--

bedtools intersect -wa -wb -a input1 -b input2 -f 1 -r >intersect.bed

那么有什么方法可以将相交和不相交的结果包含在同一个 intersect.bed 文件中,就像这样我想要我的结果 -

X   10063445    10098579    X:10063445|10098579     X   10063445    10098579    2
X   101020487   101021315   X:101020487|101021315   
X   101041317   101042312   X:101041317|101042312   X   101041317   101042312   3
X   101120402   101120784   X:101120402|101120784   
X   101126709   101148161   X:101126709|101148161   X   101126709   101148161   4
X   107088436   107088839   X:107088436|107088839   X   107088436   107088839   4
X   110020352   110067396   X:110020352|110067396   
X   110020352   110109146   X:110020352|110109146   X   110020352   110109146   3
X   110067347   110109146   X:110067347|110109146   X   110067347   110109146   4
X   11055936    11110981    X:11055936|11110981 

所以在这里我期望输出这样的结果,其中包括相交和不相交。谢谢

答案1

我很确定可以用 awk 来完成..无论如何我喜欢这个问题。这不是最省时有效的解决方案。

file1='file1'
file2='file2'
file_new='new_file'
file_not_matched='not_matched'
delimiter='\t' #when joining strings in the new file

true > $file_new 
true > $file_not_matched

IFS=$'\n'
#walk file1
for line1 in `cat $file1`; do
        line1_match=`echo $line1 | awk '{print $2 FS $3}'`
        echo -n "$line1" >> new_file

        #walk file2
        for line2 in `cat $file2`; do
                line2_match=`echo $line2 | awk '{print $2 FS $3}'`

            #test lines
            if [ "$line1_match" == "$line2_match" ];
                then

                    echo -e "$delimiter$line2" >> new_file
                    continue 2
            fi
        done
        echo "" >> new_file
        echo $line1 >> not_matched
done

相关内容