Jag genererade en fil som börjar med följande sängrader:
$ head -6 /tmp/bed_with_gene_ids.bedI 3746 3909 "WBGene00023193". -I 3746 3909 "WBGene00023193". -I 4118 4220 "WBGene00022277". -I 4118 4358 "WBGene00022277". -I 4118 10230 "WBGene00022277". -I 4220 4223 "WBGene00022277". -
Jag vill slå samman dem baserat på namnfältet (den fjärde kolumnen), med min för start och max för slutet. Andra fält förväntas vara desamma för alla poster med samma namn.
Förväntat resultat:
I 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -
Jag hittade en potentiell lösning baserad på bedtools groupby
här: https://www.biostars.org/p/145751/#145775
Exempeldata:
cat genes.bedchr14 49894259 49895806 ENSMUST00000053290 0.000000 ... chr14 49894873 49894876 ENSMUST00000053290 0.000000. ..chr14 49894876 49895800 ENSMUST00000053291 0,000000 ... chr14 49895797 49895800 ENSMUST00000053291 0,000000 ... chr14 49901908 49901941 ENSMUST00000053291 0,000000 ...
Exempel på utdataqu:
sortera -k4,4 gener.bädd \ | groupBy -g 1,4 -c 4,2,3 -o antal, min, max \ | awk -v OFS = '\ t' '{skriv ut $ 1, $ 4, $ 5, $ 2, $ 3}' chr14 49894259 49895806 ENSMUST00000053290 2chr14 49894876 49901941 ENSMUST00000053291 3
Men:
Jag förstår inte gruppenBet beteende (Varför
-g 1,4 och inte bara-g 4 ?, Varför -c 4,2,3 i den här ordningen och ordna sedan om saker medawk
?)Den här koden fungerar inte fungerar för mig.
Det här är vad som händer när jag försöker lösningen ovan:
$ head -3 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 1,4 -c 4,2,3 -o antal, min, max | awk -v OFS = '\ t' '{print $ 1, $ 4, $ 5, $ 2, $ 3}' 3 3746 4220 Här är försök baserat på vad jag trodde kunde fungera enligt dokumentationen:
$ head -6 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 4 -c 1,2,3,4,5,6 -o först, min, max, distinkt, först, förstI 3746 10230 "WBGene00022277", "WBGene00023193". - $ head -6 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 4 -c 1,2,3,4,5,6 -o först, min, max, sista, första, förstI 3746 10230 "WBGene00022277". - $ head -6 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 4 -c 1,2,3,5,6 -o först, min, max, första, förstI 3746 10230. -
Jag förstår inte varför när jag grupperar baserat på den fjärde kolumnen, för vilken jag har två distinkta värden, kan jag inte få två rader i den resulterande utdata.
Jag förstår utifrån kommentarerna på dokumentationssidan att dokumentationen inte är uppdaterad. I synnerhet finns det ett
-fullt
-alternativ som behövs om man vill att alla fält ska matas ut. Efter att ha läst igen ovan nämnda lösning tror jag att jag nu förstår orsaken till de flera kolumnerna för-g-alternativet
och förawk
-omläggningen. Därav följande försök.$ head -6 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 1,4,5,6 -c 2,3 -o min, max -full I 3746 3909 "WBGene00023193". - 3746 10230
Men detta ger mig fortfarande inte två rader.
Finns det andra verktyg som kan göra vad jag vill effektivt?
Redigera: Lösning
Enligt detta svar är problemet med sängverktyg att det finns ett fel i den senaste versionen (2.26.0 från augusti 2017). För att ha en funktionell
bedtools groupby
måste man hämta utvecklingsversionen från github.Med github-versionen av sängverktyg kan jag nu få det förväntade resultatet enligt följande:
$ head -6 /tmp/bed_with_gene_ids.bed | sängverktyg gruppby -g 1,4,5,6 -c 2,3 -o min, max | awk -v OFS = "\ t" '{skriv ut $ 1, $ 5, $ 6, $ 2, $ 3, $ 4}' I 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -
Jag inkluderar fält 1, 5 och 6 i
-g
(förutom fält 4) för att få dem att skrivas ut. I min sängfil ska de vara desamma för ett visst värde i fält 4.awk
-delen behövs eftersom man tydligen inte har total kontroll på utmatningsordningen:-g kod> fält kommer före fälten
-c .