这是第一个输入 - 其中包含 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