2017-06-24 29 views
0

coords.txtという名前のファイルがあります。ここには数多くの座標がリストされています。一行一行ずつ読んで何かをしたいのですが、まずx、y、zを設定する必要があります。シェルスクリプトを使って座標を解釈する方法は?

coords.txt:

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

shell.shEDIT:私たちは問題ではありようbash shell.sh coords.txt

が見える使用して、それを開始

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" 

coord_reader、xの結果が得られました。

私はstackoverflowに新しいです、私は尋ねるスキルを向上させることができますので、自由にコメントしてください。

答えて

1

正規表現は1桁の数字と一致し、キャプチャグループは使用していません。 (余談として、あなたはwhileループ内|| [[ -n $line ]]ハックを必要としないようにcoords.txtが正しく、改行で終わることを確認してください。)

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

Thxが '|| [[-n $ line]] 'info btw :)私はそれをチェックアウトします! – realKSMC

+0

さて、ファイルの座標を少しだけ小さくすれば、動作しますが、5000以上のエントリでは動作しません:/それを修正する方法は? – realKSMC

+0

このコードについては、処理できる行数の上限が示唆されていません。パフォーマンスは遅くなりますが、それでも機能するはずです。 – chepner

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

別の方法としては、awkのです。正規表現のパターンマッチングを行います。コンマの前にもスペースがあることに気付きます(これが意図的なのかどうかわかりません)。パターンが一致する場合は、x =、y =、z =の文字列をコンマで区切って出力します。

関連する問題