2010-06-24 22 views
6

Ich habe Zeilen von Daten, die wie folgt aussieht:Entfernen Teile String mit Sed

sp_A0A342_ATPB_COFAR_6_+_contigs_full.fasta 
sp_A0A342_ATPB_COFAR_9_-_contigs_full.fasta 
sp_A0A373_RK16_COFAR_10_-_contigs_full.fasta 
sp_A0A373_RK16_COFAR_8_+_contigs_full.fasta 
sp_A0A4W3_SPEA_GEOSL_15_-_contigs_full.fasta 

Wie kann ich sed Teile Zeichenfolge zu löschen, nachdem 4. Spalte (_ getrennt) für jede Zeile. Schließlich ergibt:

sp_A0A342_ATPB_COFAR 
sp_A0A342_ATPB_COFAR 
sp_A0A373_RK16_COFAR 
sp_A0A373_RK16_COFAR 
sp_A0A4W3_SPEA_GEOSL 

Antwort

19

cut ist eine bessere Passform.

cut -d_ -f 1-4 old_file 

Dies bedeutet einfach _ als Trennzeichen verwenden und Felder 1-4 beibehalten.

Wenn Sie auf sed bestehen:

sed 's/\(_[^_]*\)\{4\}$//' 

Diese linken Seite entspricht genau vier Wiederholungen einer Gruppe, bestehend aus einem Unterstrich, gefolgt von 0 oder mehr Nicht-Unterstrichen. Danach müssen wir am Ende der Linie stehen. Dies wird alles durch nichts ersetzt.

1
sed -e 's/_[0-9][0-9]*_[+-]_contigs_full.fasta$//g' 

Noch ist die Schnittantwort wahrscheinlich schneller und nur allgemein besser.

1

Ja, schneiden ist viel besser, und ja, die Rückseite jeder ist einfacher.

Ich habe endlich eine Übereinstimmung mit dem Anfang jeder Zeile:

sed -r 's/(([^_]*_){3}([^_]*)).*/\1/' oldFile > newFile 
2
sed -e 's/\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^_]*\)_.*/\1_\2_\3_\4' infile > outfile 

Match "eine beliebige Anzahl von nicht '_'", retten, was zwischen \ angepasst wurde (und \), gefolgt von "_". Tun Sie dies 4 mal, dann passen Sie alles für den Rest der Zeile (zu ignorieren). Ersetzen Sie jedes Match durch "_".

2

Hier ist eine andere Möglichkeit:

sed -E -e 's|^([^_]+(_[^_]+){3}).*$|\1|' 

wo -E, wie -r in GNU sed, auf erweiterte reguläre Ausdrücke zur besseren Lesbarkeit macht.

Nur weil Sie können es tun in sed, aber bedeutet nicht, Sie sollten . Ich schneide viel besser dafür.

1

AWK mag in den Bereichen spielen:

awk 'BEGIN{FS=OFS="_"}{print $1,$2,$3,$4}' inputfile 

oder allgemeiner:

awk -v count=4 'BEGIN{FS="_"}{for(i=1;i<=count;i++){printf "%s%s",sep,$i;sep=FS};printf "\n"}' 
Verwandte Themen