Answers.Body: <pre><code>awk 'BEGIN{OFS="\t"}{if($1==lchrom &amp;&amp; $4==lname &amp;&amp; $2 == lend) {lend = $3}else{if(lchrom) {print lchrom, lstart, lend, lname;}; lchrom=$1; lstart=$2; lend=$3; lname=$4}}END{print lchrom, lstart, lend, lname}' foo.bed &gt; new.bed
  </code></pre>
  
  <p>That produces:</p>
  
  <pre><code>chr1    0   10000   LOC101929784::chr1:13201-13800::E1
  chr1    10000   10600   LOC101929784::chr1:13201-13800::XYZ
  chr1    10600   10800   LOC101929784::chr1:13201-13800::E1
  chr1    10800   13200   DDX11L1::chr1:11868-14409.E1
  chr1    13200   29600   WASH7P::chr1:14403-29570.E1
  chr1    29600   31400   MIR1302-2HG::chr1:29553-31109.E1
  </code></pre>
  
  <p>This explicitly checks for bookends and nothing else and assumes that everything is sorted.</p>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2018-02-12T17:04:57.130Z
Answers.LastActivityDate: 2018-02-12T17:04:57.130Z
Answers.UserDisplayName: Devon Ryan
Body: <p>I have a bed file where some entries have the same name in column 4 but are book-ended in coordinates, e.g. see below:</p>
  
  <pre><code>chr1    0       10000   LOC101929784::chr1:13201-13800::E1
  chr1    10000   10600   LOC101929784::chr1:13201-13800::XYZ
  chr1    10600   10800   LOC101929784::chr1:13201-13800::E1
  chr1    10800   12000   DDX11L1::chr1:11868-14409.E1
  chr1    12000   12200   DDX11L1::chr1:11868-14409.E1
  chr1    12200   13000   DDX11L1::chr1:11868-14409.E1
  chr1    13000   13200   DDX11L1::chr1:11868-14409.E1
  chr1    13200   15800   WASH7P::chr1:14403-29570.E1
  chr1    15800   16000   WASH7P::chr1:14403-29570.E1
  chr1    16000   18200   WASH7P::chr1:14403-29570.E1
  chr1    18200   18400   WASH7P::chr1:14403-29570.E1
  chr1    18400   23000   WASH7P::chr1:14403-29570.E1
  chr1    23000   23400   WASH7P::chr1:14403-29570.E1
  chr1    23400   24000   WASH7P::chr1:14403-29570.E1
  chr1    24000   24200   WASH7P::chr1:14403-29570.E1
  chr1    24200   25200   WASH7P::chr1:14403-29570.E1
  chr1    25200   25800   WASH7P::chr1:14403-29570.E1
  chr1    25800   26200   WASH7P::chr1:14403-29570.E1
  chr1    26200   26400   WASH7P::chr1:14403-29570.E1
  chr1    26400   27000   WASH7P::chr1:14403-29570.E1
  chr1    27000   27600   WASH7P::chr1:14403-29570.E1
  chr1    27600   27800   WASH7P::chr1:14403-29570.E1
  chr1    27800   29600   WASH7P::chr1:14403-29570.E1
  chr1    29600   30800   MIR1302-2HG::chr1:29553-31109.E1
  chr1    30800   31400   MIR1302-2HG::chr1:29553-31109.E1
  </code></pre>
  
  <p>I would like to apply an operation that seems to me is a mix of <code>bedtools merge -d 0</code> and <code>bedtools groupby</code>, but I can't figure out what's the combination.</p>
  
  <p>For example, the 4 entries with <code>DDX11L1::chr1:11868-14409.E1</code> I would like merged as they are book-ended, same with the <code>WASH7P::chr1:14403-29570.E1</code> entries and the <code>MIR1302-2HG::chr1:29553-31109.E1</code> entries. There are two <code>LOC101929784::chr1:13201-13800::E1</code> entries, but I don't want to merge them because they are not book-ended, since they are separated by <code>LOC101929784::chr1:13201-13800::XYZ</code>.</p>
  
  <p>Any ideas?</p>
  
Tags: <bed><bedtools>
Title: bed file merge book-end features only if same name in column 4
ThreadText: # bed file merge book-end features only if same name in column 4
  
  (Asked by: username_0 on 2018-02-12)
  
  I have a bed file where some entries have the same name in column 4 but are book-ended in coordinates, e.g. see below:
  
  ```
  chr1    0       10000   LOC101929784::chr1:13201-13800::E1
  chr1    10000   10600   LOC101929784::chr1:13201-13800::XYZ
  chr1    10600   10800   LOC101929784::chr1:13201-13800::E1
  chr1    10800   12000   DDX11L1::chr1:11868-14409.E1
  chr1    12000   12200   DDX11L1::chr1:11868-14409.E1
  chr1    12200   13000   DDX11L1::chr1:11868-14409.E1
  chr1    13000   13200   DDX11L1::chr1:11868-14409.E1
  chr1    13200   15800   WASH7P::chr1:14403-29570.E1
  chr1    15800   16000   WASH7P::chr1:14403-29570.E1
  chr1    16000   18200   WASH7P::chr1:14403-29570.E1
  chr1    18200   18400   WASH7P::chr1:14403-29570.E1
  chr1    18400   23000   WASH7P::chr1:14403-29570.E1
  chr1    23000   23400   WASH7P::chr1:14403-29570.E1
  chr1    23400   24000   WASH7P::chr1:14403-29570.E1
  chr1    24000   24200   WASH7P::chr1:14403-29570.E1
  chr1    24200   25200   WASH7P::chr1:14403-29570.E1
  chr1    25200   25800   WASH7P::chr1:14403-29570.E1
  chr1    25800   26200   WASH7P::chr1:14403-29570.E1
  chr1    26200   26400   WASH7P::chr1:14403-29570.E1
  chr1    26400   27000   WASH7P::chr1:14403-29570.E1
  chr1    27000   27600   WASH7P::chr1:14403-29570.E1
  chr1    27600   27800   WASH7P::chr1:14403-29570.E1
  chr1    27800   29600   WASH7P::chr1:14403-29570.E1
  chr1    29600   30800   MIR1302-2HG::chr1:29553-31109.E1
  chr1    30800   31400   MIR1302-2HG::chr1:29553-31109.E1
  
  ```
  
  I would like to apply an operation that seems to me is a mix of `bedtools merge -d 0` and `bedtools groupby`, but I can't figure out what's the combination.
  
  For example, the 4 entries with `DDX11L1::chr1:11868-14409.E1` I would like merged as they are book-ended, same with the `WASH7P::chr1:14403-29570.E1` entries and the `MIR1302-2HG::chr1:29553-31109.E1` entries. There are two `LOC101929784::chr1:13201-13800::E1` entries, but I don't want to merge them because they are not book-ended, since they are separated by `LOC101929784::chr1:13201-13800::XYZ`.
  
  Any ideas?
  
  **Tags:** bed, bedtools
  
  
  ---
  
  ## 1 answers
  
  ### Answer by username_1 on 2018-02-12. Score: 5 | Accepted answer
  
  ```
  awk 'BEGIN{OFS="\t"}{if($1==lchrom && $4==lname && $2 == lend) {lend = $3}else{if(lchrom) {print lchrom, lstart, lend, lname;}; lchrom=$1; lstart=$2; lend=$3; lname=$4}}END{print lchrom, lstart, lend, lname}' foo.bed > new.bed
  
  ```
  
  That produces:
  
  ```
  chr1    0   10000   LOC101929784::chr1:13201-13800::E1
  chr1    10000   10600   LOC101929784::chr1:13201-13800::XYZ
  chr1    10600   10800   LOC101929784::chr1:13201-13800::E1
  chr1    10800   13200   DDX11L1::chr1:11868-14409.E1
  chr1    13200   29600   WASH7P::chr1:14403-29570.E1
  chr1    29600   31400   MIR1302-2HG::chr1:29553-31109.E1
  
  ```
  
  This explicitly checks for bookends and nothing else and assumes that everything is sorted.
  
  
  ---
  
  