Gegeben ist eine liste, die durch , getrennt ist, also zB var="dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" (in der Variable könnten auch " oder ' vorkommen, es sind alle Zeichen aus Latin1 möglich) Nun sollen alle Felder, d.h. zwischen den Kommata entfernt werden, die ? Zeichen erhalten. Im Beispiel wäre das Ergebnis also: dfsdf, as sdfd, sd fdsf dsf, dfas Was wäre eine bessere Lösung als: echo "$var" | tr ',' '\n' | grep -v "?" | tr '\n' ',' | sed 's/,*$//' dfsdf, as sdfd, sd fdsf dsf, dfas Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Tue, 19 Apr 2011, Al Bogner schrieb:
Gegeben ist eine liste, die durch , getrennt ist, also zB
var="dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" (in der Variable könnten auch " oder ' vorkommen, es sind alle Zeichen aus Latin1 möglich)
Nun sollen alle Felder, d.h. zwischen den Kommata entfernt werden, die ? Zeichen erhalten.
Im Beispiel wäre das Ergebnis also: dfsdf, as sdfd, sd fdsf dsf, dfas
Was wäre eine bessere Lösung als:
echo "$var" | tr ',' '\n' | grep -v "?" | tr '\n' ',' | sed 's/,*$//' dfsdf, as sdfd, sd fdsf dsf, dfas
Schnellschuss (und was auch immer das '?' ist): $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' 'BEGIN { ORS=","; } { for(i=1;i<=NF;i++) { if( $i !~ /?/ ) { print $i; }; }; printf "\n"; }' dfsdf, as sdfd, sd fdsf dsf, dfas, Oder, man bastelt sich die Zeile neu, was die Ausgabe schöner macht: $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' 'BEGIN { OFS=","; } { for( i=1;i<=NF;i++) { if( $i ~ /\?/ ) { $i=""; }; }; print; }' dfsdf, as sdfd, sd fdsf dsf,,,, dfas oder: echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' ' { for( i = 1; i <= NF; i++ ) { if( $i !~ /\?/) { l[j] = $i; j++; }; }; for(f in l) { printf("%s,", l[f]); }; printf("\n"); }' dfsdf, as sdfd, sd fdsf dsf, dfas, Oder man macht sich's einfacher: $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ perl -Mstrict -w -F',' -an -e ' my @L; foreach(@F) { if(!m/\?/) { push(@L, $_); } }; print join(",", @L); ' dfsdf, as sdfd, sd fdsf dsf, dfas Funktioniert auch mehrzeilig (und mit anderen/mehreren usw. Zeichen und Strings statt dem '?'). -dnh PS: bzgl. der PM, da brauch ich noch ne Weile ... -- 149: Telefon Gerät, das die Person am anderen Ende der Leitung bescheuert macht. (Funktioniert in beide Richtungen) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Al, Am Dienstag, 19. April 2011 23:44:31 schrieb Al Bogner:
Gegeben ist eine liste, die durch , getrennt ist, also zB
var="dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" (in der Variable könnten auch " oder ' vorkommen, es sind alle Zeichen aus Latin1 möglich)
Nun sollen alle Felder, d.h. zwischen den Kommata entfernt werden, die ? Zeichen erhalten.
Im Beispiel wäre das Ergebnis also: dfsdf, as sdfd, sd fdsf dsf, dfas
Was wäre eine bessere Lösung als:
echo "$var" | tr ',' '\n' | grep -v "?" | tr '\n' ',' | sed 's/,*$//' dfsdf, as sdfd, sd fdsf dsf, dfas
evtl. awk, du müsstest dann in einer Schleife durch die Felder iterieren und schauen ob ein ? drin ist. echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf $i","}' oder nach printf lehrbuch echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf "%s,",$i}' falls du einen evtl. zeilenumbruch wieder brauchst solltest du nach der schleife noch ein print einfügen. echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf "%s,",$i; print}' untested! jeweils alles in einer Zeile Sowohl akw als auch sed sind nicht die schnelltsen, man sollte bei solch kleinen Aufgaben immer beide testen, je nach Aufgabe kann man da die eine oder andere Überraschung erleben. -- Gruss Falk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (3)
-
Al Bogner
-
David Haller
-
Falk Sauer