grep, awk , sed hjælp
Hejsa folkens jeg har en fil der er fyldt med følgende :
./2787_INTRON_1.fasta.motif.h2.1
./1681_INTRON_1.fasta.motif.h2.4.3.5
./3745_INTRON_1.fasta.motif.h1.2.3
./518_INTRON_1.fasta.motif.h1.1.h2.3.2.h2.2
./1321_INTRON_5.fasta.motif.h2.1.4
./1681_INTRON_3.fasta.motif.h2.5
./2787_INTRON_1.fasta.motif.h1.2
+300 linjer
Det jeg så gerne vil have ud af filen er:
2787_INTRON_1.fasta
1681_INTRON_1.fasta
3745_INTRON_1.fasta
518_INTRON_1.fasta
osv...
Regnede med at man kunne bruge sed eller awk til dette, men jeg ikke super skarp til regexp og den slags.
Håber der er nogle skarpe folk her inde der kan hjælpe.
På forhånd tak
//Peter
- Log in to post comments
Kommentarer5
Re: grep, awk , sed hjælp
Du kan også gøre det uden regex, fx:
cat FILE | cut -d. -f2,3 | cut -d/ -f2
Første cut splitter på "." og giver mig del 2 og 3 pr. linje
Anden cut splitter på "/" og giver mig del 2 pr. linje.
Dette virker hos mig:sed -r
Dette virker hos mig:
sed -r 's#\./([0-9]+_INTRON_[0-9]+\.fasta).*#\1#' FILE
Re: grep, awk , sed hjælp
#1 er en ret elegant løsning - jeg er ikke så meget inde i cut og dette er et godt læreeksempel!
Men hos mig er sed-løsningen meget hurtigere end cut-løsningen, selv med det lille eksempel. Måske fordi den kun indlæser filen én gang?
Re: grep, awk , sed hjælp
Tak for hjælpen det spiller maximalt
#3
Jeh tror sed er
#3
Jeh tror sed er hurtigere, fordi det kun er en proces, hvor mit eksempel bruger tre processer, hvor der først læses data som sendes data fra proces 1 (cat) til proces 2 (cut -d.) som ændre på dataen og sender resultatet til proces 3 (cut -d/) der skriver det ud.
Jeg har dog lidt svært ved at forstå det er _meget_ hurtigere, der er ikke meget data som skal behandles.
Grunden til jeg foretrækker "cut" til sådan en opgave er at det for mig er langt hurtigere lave end det er at skrive et regex til opgaven.
Hvor jeg ville bruge "sed" til mere avancerede opgaver, hvor dataen er sværere at få fat på eller skal manipulerers mere end cut kan.
Med standard utils kan mit eksempel nemt udvides til fx. at fjerne duplikater, hvis vi nu forestiller os at flere linjer kan være ens.
cat FILE | cut -d. -f2,3 | cut -d/ -f2 | sort -u
Så får vi en sorteret liste uden duplikater.
Hvis vi vil have sorteret numerisk (linjerne start jo med tal) så tilføjer vi blot -n til sort.
cat FILE | cut -d. -f2,3 | cut -d/ -f2 | sort -n -u