2017-02-02 3 views
1

Ich habe eine CSV-Datei, dass Werte wie:Split String nach dem Wort in der Schale passend

Wt-Do-U-Do-Wit-The-Black,black 
Yay-Its-Your-Birthday-Black,black 
You-Are-My-Sunshine-Happy-Birthday-Red,red 
You-Are-Special-Navy-Blue,navy-blue 
You-Dont-Look-A-Day-Over-Fabulous-Green,green 
You-My-Friend-Are-Ridiculously-Fabulous-Happy-Birthday-Pink,pink 

ich jede Saite vor Farbbezeichnung comes.For Ex teilen möchten:

str1=Wt-Do-U-Do-Wit-The 
str1=Yay-Its-Your-Birthday 
str1=You-Are-My-Sunshine-Happy-Birthday 
str1=You-Are-Special 
str1=You-Dont-Look-A-Day-Over-Fabulous 
str1=You-My-Friend-Are-Fabulous-Happy-Birthday 

Zum Suchen der Zeichenfolge verwende ich: -

Es ist in Ordnung. Aber wie kann ich die Saite teilen?

Eine andere Art und Weise habe ich:

colour_arr[0]='Red' 
colour_arr[1]='Black' 
colour_arr[2]='Navy-Blue' 
colour_arr[3]='White' 
inarray=$(echo ${colour_arr[@]} | grep -o "$string" | wc -w) 
echo "$inarray" 

Aber das funktioniert nicht.

+0

Können Sie Ihre genaue Eingabe geben, wie es mit einem erwarteten Ausgang ist eher als posten, was Sie versucht haben, das Problem zu lösen (unbekannt) 'XY-Problem' – Inian

+0

Haben die Eingabezeilen folgendes Muster' "4 Wörter", Farbname'? – sameerkn

+0

@sameerk: first spalte haben andere string nicht nur 4 worte, farbe name ist gleich – Urvashi

Antwort

2

können Sie verwenden sed; inspiriert von this answer

vereinfachte ich das Problem ein wenig, da Sie die Saiten bereits korrekt analysiert; Verwenden dieser Eingabedatei:

This is red colour 
Ball is black colour 
some more words before red and more after 

für den zweiten Teil der Zeichenfolge; mit der Farbbezeichnung Start:

sed -n -e 's/^.*\(\(red\|black\).*\)/\1/p' test 

gibt:

red colour 
black colour 
red and more after 

und

sed -n -e 's/\(^.*\)\(\(red\|black\).*\)/\1/p' test 

gibt:

This is 
Ball is 
some more words before 

Ich werde alle Optionen nicht erklären; weil sie in der Antwort, auf die ich mich bezog, gut erklärt sind. Sie können sed verwenden auf einer Bash Variable:

leftpart=$(sed -n -e 's/\(^.*\)\(\(red\|black\).*\)/\1/p' <<< $INPUT_STRING) 

EDIT nach der OP das Eingabeformat geändert: meine Antwort immer noch gilt; Ersetzen Sie einfach Rot durch Rot. Der Rest gilt gleich.

+0

Danke .Es funktioniert. leftpart = $ (sed -n -e 's/\ (^. * \) \ (\ (rot \ | schwarz \). * \)/\ 1/p' <<< $ INPUT_STRING) – Urvashi

1

Für Ihre neue Eingabe

Eingang

$ cat f2 
Wt-Do-U-Do-Wit-The-Black,black 
Yay-Its-Your-Birthday-Black,black 
You-Are-My-Sunshine-Happy-Birthday-Red,red S 
You-Are-Special-Navy-Blue,navy-blue 
You-Dont-Look-A-Day-Over-Fabulous-Green,green 
You-My-Friend-Are-Ridiculously-Fabulous-Happy-Birthday-Pink,pink 

Ausgang (mit gawk)

$ awk 'BEGIN{IGNORECASE=1;FS="[ ,]";OFS=","}match($1,$2){print "str1="substr($1,1,RSTART-2)}' f2 
str1=Wt-Do-U-Do-Wit-The 
str1=Yay-Its-Your-Birthday 
str1=You-Are-My-Sunshine-Happy-Birthday 
str1=You-Are-Special 
str1=You-Dont-Look-A-Day-Over-Fabulous 
str1=You-My-Friend-Are-Ridiculously-Fabulous-Happy-Birthday 

für Ihren alten Eingang

Eingang

$ cat f 
"This is red colour",red 
"Ball is black colour",black 
"Tshirt is white colour",white 
"Shoes are blue colour",blue 
"This is green colour",green 

Ausgabe

$ awk 'BEGIN{FS=OFS=","}{gsub(/"/,"");match($1,$2);print "str1="substr($1,1,RSTART-1),"str2=" substr($1,RSTART) }' f 
str1=This is ,str2=red colour 
str1=Ball is ,str2=black colour 
str1=Tshirt is ,str2=white colour 
str1=Shoes are ,str2=blue colour 
str1=This is ,str2=green colour 
+0

Die Ausgabe ist in der Tat wonach der Benutzer fragt; aber das gibt ihm nicht jeden Teil der Zeichenfolge in einer Bash-Variable ... –

0

OneLiner awk mit (Gnu für IGNORECASE)

awk -F ',' 'BEGIN{IGNORECASE=1}{sub("-"$NF"$","",$1);print "str1="$1}' YourFile 

Selbst Code kommentiert

awk -F ',' '# sepeartor of field is coma 
# before first line 
BEGIN{ 
    # define case compair behaviour (ignoring the case) 
    IGNORECASE=1 
    } 
# for each line 
{ 
    # substitute the pattern (minus than field 2 content, so the color, at the end) in fields 1 by "" (remove) 
    sub("-" $NF "$", "", $1) 
    # print the new content of filed 1 with str1= before 
    print "str1="$1 
    }' YourFile 
0

Basierend auf Ihre Kommentare, müssen Sie Farbe aus dem ersten „gestrichelte“ Feld, nicht der Wert des zweiten Feldes (durch Komma getrennt).

Wenn Farbe in diesem ersten „gestrichelte“ Feld immer die letzte Zeichenfolge (Bindestrich getrennt), können Sie einfach
a="You-Are-My-Sunshine-Happy-Birthday-Red" ; awk -F- '{print $NF}' <<<"$a"

PS: Sie können das erste Feld der ganzen Linie mit Schnitt oder awk isolieren : awk -f, '{print $1}' <<<"$fileline" oder cut -d, -f1 <<<"$fileline"

Sie können oben zwei kombinieren, um zu erreichen, was Sie brauchen.

0

Keep it simple:

$< input.txt 
Wt-Do-U-Do-Wit-The-Black,black 
Yay-Its-Your-Birthday-Black,black 
You-Are-My-Sunshine-Happy-Birthday-Red,red 
You-Are-Special-Navy-Blue,navy-blue 
You-Dont-Look-A-Day-Over-Fabulous-Green,green 
You-My-Friend-Are-Ridiculously-Fabulous-Happy-Birthday-Pink,pink 

$sed -E 's/(-[^-]+)(,.*)/\2/g' input.txt 
Wt-Do-U-Do-Wit-The,black 
Yay-Its-Your-Birthday,black 
You-Are-My-Sunshine-Happy-Birthday,red 
You-Are-Special-Navy,navy-blue 
You-Dont-Look-A-Day-Over-Fabulous,green 
You-My-Friend-Are-Ridiculously-Fabulous-Happy-Birthday,pink 

(Anmerkung: auf meinem OS, OSX, sed -E für längere regex ist.)

Verwandte Themen