peddy
Anmeldungsdatum: 31. Oktober 2006
Beiträge: Zähle...
Wohnort: Mainz
|
Hallo, wie kann ich einen mit regex gefundenen String in Spalte 3 behalten und den Rest der Spalte löschen? Gefunden werden soll .kern_[0-9]{2} Quelle
3145,abcd,kern_03_123456,12
8155,abcd,kern_01_abcdef,102 Ziel
3145,abcd,kern_03,12
8155,abcd,kern_01,102
|
cosinus
Anmeldungsdatum: 11. Mai 2010
Beiträge: 1374
Wohnort: HB
|
Hm...also ich habs auf die Schnelle mit Hilfe von sed am Anfang hinbekommen. | sed -r 's/(,|_)/ /g' quelldatei | awk '{ print $1","$2","$3"_"$4","$6 }'
|
Ausgabe: 3145,abcd,kern_03,12 8155,abcd,kern_01,102
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Beispielsweise so:
| sed -r "s/(kern_[0-9]{2})[^,]*/\1/" quelle
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Mit awk geht das z.B. so:
| awk -F ',' 'BEGIN{OFS=","}{sub(/_[^_]*$/, "", $3); print $0}' quelle
|
Also: Nutze das Komma als Feldtrenner für Ein- und Ausgabe, ersetze in $3 Matches für den regulären Ausdruck _[^_]$ durch einen leeren String und gib alle Felder aus.
|
peddy
(Themenstarter)
Anmeldungsdatum: 31. Oktober 2006
Beiträge: 162
Wohnort: Mainz
|
misterunknown schrieb: Beispielsweise so:
| sed -r "s/(kern_[0-9]{2})[^,]*/\1/" quelle
|
Deine Variante habe ich jetzt in mein Script eingebaut. Funktioniert so weit ganz gut.
|
peddy
(Themenstarter)
Anmeldungsdatum: 31. Oktober 2006
Beiträge: 162
Wohnort: Mainz
|
seahawk1986 schrieb: Mit awk geht das z.B. so:
| awk -F ',' 'BEGIN{OFS=","}{sub(/_[^_]*$/, "", $3); print $0}' quelle
|
Also: Nutze das Komma als Feldtrenner für Ein- und Ausgabe, ersetze in $3 Matches für den regulären Ausdruck _[^_]$ durch einen leeren String und gib alle Felder aus.
Da hätte ich aber auch mal drauf kommen können und nach dem Teil filtern der gelöscht werden soll. Leider funktioniert dein Beispiel in meinem Konkreten Fall jedoch noch nicht. Da bin ich aber dran Schuld, da ich in der Fragestellung eine vereinfachtes Beispiel genommen habe. Eigentlich ist in der Spalte so etwas zu finden, wodurch das regex nicht greif. kern_04_21cbzap48_02591
kern_04_21cbzap47_02591
kern_04_21cbzap48_02591
kern_05_perseus02600-1_02600
kern_02_perseus02590-1_02590
kern_05_perseus02600-1_02600
kern_05_perseus02600-1_02600
kern_02_perseus02590-1_02590
kern_04_21cbzap48_02591
kern_04_21cbzap47_02591
kern_04_21cbzap47_02591
|
peddy
(Themenstarter)
Anmeldungsdatum: 31. Oktober 2006
Beiträge: 162
Wohnort: Mainz
|
Noch eine Frage an die awk Spezialisten: Könnte man nicht auch nach
.kern_[0-9]{2}
suchen und das Ergebnis in eine Variable schreiben? Danach könnte man doch die Variable in $3 schreiben.
$3=x
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Reicht es dir, wenn man $3 an den Underscores zerlegt und die ersten beiden Felder nimmt?
| awk -F ',' 'BEGIN{OFS=","}{split($3, sf, "_"); $3=sf[1]"_"sf[2]; print $0}' quelle
|
|
peddy
(Themenstarter)
Anmeldungsdatum: 31. Oktober 2006
Beiträge: 162
Wohnort: Mainz
|
seahawk1986 schrieb: Reicht es dir, wenn man $3 an den Underscores zerlegt und die ersten beiden Felder nimmt?
| awk -F ',' 'BEGIN{OFS=","}{split($3, sf, "_"); $3=sf[1]"_"sf[2]; print $0}' quelle
|
Ja, das würde reichen. Danke.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Es gäbe auch noch diese Variante | $ cat x
3145,abcd,kern_03_123456,12
8155,abcd,kern_01_abcdef,102
$ awk -F , -v OFS=, '{i=match($3,/^kern_[0-9][0-9]/);if(i)$3=substr($3,RSTART,RLENGTH);print}' x
3145,abcd,kern_03,12
8155,abcd,kern_01,102
|
Da die Länge hier fest ist, könnte man auch dies machen: | $ awk -F , -v OFS=, '{i=match($3,/^kern_[0-9][0-9]/);if(i)$3=substr($3,1,7);print}' x
3145,abcd,kern_03,12
8155,abcd,kern_01,102
|
|