2017-06-24 3 views
0

Wir haben eine Datei namens coords.txt wo Tonnen von Koordinaten aufgelistet sind. Wir möchten sie Zeile für Zeile lesen und etwas mit ihnen machen, aber zuerst müssen wir x, y und z setzen.Wie interpretiere ich Koordinaten mit Shell-Skript?

coords.txt:

0, 0, 0 
1, 1, 1 
232, 434, 434 
644, 322, 112 

shell.shEDIT:

coord_reader='^[0-9], [0-9], [0-9]' 
while IFS='' read -r line || [[ -n "$line" ]]; do 
echo $line 
    if [[ $line =~ $coord_reader ]]; then 

     x=${BASH_REMATCH[1]} 
     y=${BASH_REMATCH[2]} 
     z=${BASH_REMATCH[3]} 
     echo "x is $x, y is $y, z is $z" 
else 
echo "wrong" 
fi 

done < "$1" 

Wir starten Sie es bash shell.sh coords.txt

Sieht aus wie es ein Problem in die coord_reader, bekomme ich nur ein Ergebnis für x.

Ich bin neu in Stackoverflow, fühlen sich frei, dies kommentieren kann ich meine fragen Fähigkeiten verbessern.

Antwort

1

Ihr regulärer Ausdruck ist passend nur einstellige Zahlen, und Sie verwenden nicht-Capture-Gruppen. (Nebenbei, stellen Sie sicher, coords.txt ordnungsgemäß mit einem Newline endet, so dass Sie nicht brauchen die || [[ -n $line ]] Hack in Ihrem while Schleife.)

coord_reader='^([0-9]+), ([0-9]+), ([0-9]+)$' 
+0

Thx für die '|| [[-n $ line]] 'info btw :) Ich werde es überprüfen! – realKSMC

+0

Nun, wenn ich nur ein paar weniger Koordinaten in der Datei bekomme, funktioniert es, aber mit mehr als 5000 Einträgen funktioniert es nicht:/Wie behebt man das? – realKSMC

+0

Nichts an diesem Code schlägt eine obere Grenze für die Anzahl der Zeilen vor, die er verarbeiten kann. Leistung wird langsam sein, aber es sollte immer noch funktionieren. – chepner

0
awk -F, '$0 ~ /^([[:digit:]]+),[[:space:]]([[:digit:]]+),[[:space:]]([[:digit:]]+).*$/ { print "x="$1" y="$2" z="$3 }' coords.txt 

Eine weitere Alternative awk ist. Wir pattern Übereinstimmung für den regulären Ausdruck. Ich bemerke, dass vor dem Komma auch ein Leerzeichen steht (nicht sicher, ob dies beabsichtigt ist). Wenn das Muster übereinstimmt, dann drucke die Zeichenkette mit x =, y =, z = mit den relativ positionierten Zeichenketten, getrennt durch das Komma.

Verwandte Themen