2009-10-24 16 views
7

Ich möchte die Zeichenfolge aufteilen und das Array erstellen. Ich habe den folgenden Code ausprobiert:Zeichenfolge in Array aufteilen

myString="first column:second column:third column" 
set -A myArray `echo $myString | awk 'BEGIN{FS=":"}{for (i=1; i<=NF; i++) print $i}'` 
# Following is just to make sure that array is constructed properly 
i=0 
while [ $i -lt ${#myArray[@]} ] 
do 
echo "Element $i:${myArray[$i]}" 
((i=i+1)) 
done 
exit 0 

It produces the following result: 
Element 0:first 
Element 1:column 
Element 2:second 
Element 3:column 
Element 4:third 
Element 5:column 

This is not what I want it to be. When I construct the array, I want that array to contain only three elements. 
Element 0:first column 
Element 1:second column 
Element 2:third column 

Können Sie bitte beraten?

+0

fand ich die Lösung, die auf den folgenden Zeilen ist: var = 'word1 # word2 | word3/Word4 | word5.word6 | word7_word8 | word9 word10 | word11 | word12 ' OIFS = $ IFS; IFS = '|' set -Ar arr $ var IFS = $ OIFS –

+0

Sie können die for-Schleife entfernen, indem Sie eine Änderung wie unten vornehmen awk 'BEGIN {FS = ":"} {für (i = 1; i <= NF; i ++) print $ i} .behalte es als awk 'BEGIN {RS = ":"} {print}' – Vijay

+0

bash auf meinem System (4.0.33 (5) -Release) hat keine -A Option für 'set' . Welche Version laufen Sie? – outis

Antwort

5

wenn Sie auf jeden Fall in Bash verwenden Arrays möchten, können Sie auf diese Weise versuchen

$ myString="first column:second column:third column" 
$ myString="${myString//:/ }" #remove all the colons 
$ echo "${myString}" 
first column second column third column 
$ read -a myArr <<<$myString 
$ echo ${myArr[@]} 
first column second column third column 
$ echo ${myArr[1]} 
column 
$ echo ${myArr[2]} 
second 

sonst, das „besser“ Methode ist awk

+1

Um ganze Werte zu behalten, würde man verwenden: 'IFS =: read -a myArr <<< $ myString' ohne Doppelpunkte zu entfernen. –

2

Sieht aus wie Sie ganz bereits gefunden haben, zu nutzen Lösung, aber beachten Sie, dass Sie weg vollständig mit awk tun können:

myString="first column:second column:third column" 
OIFS="$IFS" 
IFS=':' 
myArray=($myString) 
IFS=$OIFS 
i=0 
while [ $i -lt ${#myArray[@]} ] 
do 
    echo "Element $i:${myArray[$i]}" 
    ((i=i+1)) 
done 
15

Hier ist, wie ich dieses Problem Ansatz würde: verwenden Sie die IFS-Variable, die die Shell (bash) zu sagen, dass Sie die Zeichenfolge teilen möchten in zu Doppelpunkt-Tokens.

$ cat split.sh 
#!/bin/sh 

# Script to split fields into tokens 

# Here is the string where tokens separated by colons 
s="first column:second column:third column" 

IFS=":"  # Set the field separator 
set $s  # Breaks the string into $1, $2, ... 
i=0 
for item # A for loop by default loop through $1, $2, ... 
do 
    echo "Element $i: $item" 
    ((i++)) 
done 

Run it:

$ ./split.sh 
Element 0: first column 
Element 1: second column 
Element 2: third column 
+1

Dies funktioniert nur bei einer Zeichenfolge/Zeile, die maximal 9 Spalten enthält. Versuchen Sie, $ 11 zu wiederholen, und Sie erhalten den Wert von $ 1 mit '1' an das Ende davon angehängt. – Dennis

+2

@Dennis - Sie müssen eine andere Notation für Positionsparameter nach 9 verwenden. '$ {10}, $ {11} ...' http://wiki.bash-hackers.org/scripting/posparams – Cheeso

+0

@Dennis: Ich habe überprüft, dass mein Code auch für Zeilen mit mehr als 10 Spalten funktioniert. Sie können es selbst überprüfen. –

4

Beachten Sie, dass das Speichern und Wiederherstellen IFS wie ich oft in diesen Lösungen gesehen hat den Nebeneffekt, dass, wenn IFS wurde nicht festgelegt, es endet geändert, um ein leer ist String, der beim anschließenden Splitten seltsame Probleme verursacht.

Hier ist die Lösung, die ich basierend auf Anton Olsen's erweitert, um> 2 Werte durch einen Doppelpunkt getrennt zu behandeln. Es behandelt Werte in der Liste, die Leerzeichen korrekt haben, nicht auf dem Leerzeichen aufteilen.

colon_list=${1} # colon-separate list to split 
while true ; do 
    part=${colon_list%%:*} # Delete longest substring match from back 
    colon_list=${colon_list#*:} # Delete shortest substring match from front 
    parts[i++]=$part 
    # We are done when there is no more colon 
    if test "$colon_list" = "$part" ; then 
     break 
    fi 
done 
# Show we've split the list 
for part in "${parts[@]}"; do 
    echo $part 
done 
3

Ksh oder Bash

#! /bin/sh 
myString="first column:second column:third column" 
IFS=: A=($myString) 

echo ${A[0]} 
echo ${A[1]} 
Verwandte Themen