ubuntuusers.de

Gefundenen String mit awk behalten

Status: Gelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

peddy

Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

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

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Wohnort: HB

Hm...also ich habs auf die Schnelle mit Hilfe von sed am Anfang hinbekommen.

1
sed -r 's/(,|_)/ /g' quelldatei | awk '{ print $1","$2","$3"_"$4","$6 }'

Ausgabe:
3145,abcd,kern_03,12
8155,abcd,kern_01,102

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Beispielsweise so:

1
sed -r "s/(kern_[0-9]{2})[^,]*/\1/" quelle

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Mit awk geht das z.B. so:

1
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)
Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

Wohnort: Mainz

misterunknown schrieb:

Beispielsweise so:

1
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)
Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

Wohnort: Mainz

seahawk1986 schrieb:

Mit awk geht das z.B. so:

1
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)
Avatar von peddy

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: 11260

Wohnort: München

Reicht es dir, wenn man $3 an den Underscores zerlegt und die ersten beiden Felder nimmt?

1
awk -F ',' 'BEGIN{OFS=","}{split($3, sf, "_"); $3=sf[1]"_"sf[2]; print $0}' quelle

peddy

(Themenstarter)
Avatar von peddy

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?

1
awk -F ',' 'BEGIN{OFS=","}{split($3, sf, "_"); $3=sf[1]"_"sf[2]; print $0}' quelle

Ja, das würde reichen. Danke.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Es gäbe auch noch diese Variante

1
2
3
4
5
6
$ 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:

1
2
3
$ 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
Antworten |