次のデータを含むファイルがあります。
input.csv
1;1.30453 103.83589;1.306663 103.83587;1.30 103.5;1.30693 103.83883;1.30709 103.835793;1.30725 103.835757;1.30741 103.83572;1.30753 103.8798
2;1.353 103.83589;1.306663 103.83587;1.30693 103.83583;1.30709 103.835793;1.30725 103.835757;1.30741 103.83572;1.30753 103.835
3;1.30653 103.83589;1.306663 103.83587;1.306797 103.83585;1.3693
.....
このファイルを次の形式に変換しようとしています。 (緯度と経度の値の位置を変更し、角括弧でグループ化し、カンマで区切りました。)
output.csv
1,[103.83589,1.30453],[103.83587,1.306663],[103.5,1.30],[103.83883,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741][103.8798,1.30753]
....など。
答え1
sed 's/;\([0-9.]*\) \([0-9.]*\)/,[\2,\1]/g' input.csv > output.csv
操作を実行しますが、2行目に区切り文字を持た1.306663 103.83587 1.30693 103.83583
ないグループがあります。;
印刷エラーでない場合は、スクリプトを次のように修正する必要があります。
sed 's/[; ]\?\([0-9.]\+\) \([0-9.]\+\)/,[\2,\1]/g' input.csv > output.csv
生産する
1,[103.83589,1.30453],[103.83587,1.306663],[103.5,1.30],[103.83883,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.8798,1.30753]
2,[103.83589,1.353],[103.83587,1.306663],[103.83583,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.835,1.30753]
3,[103.83589,1.30653],[103.83587,1.306663],[103.83585,1.306797];1.3693
答え2
これを行うには、次のGNU sed 4.2.2
簡単なスクリプトを使用できますsed
。
sed 's/\([0-9.]\+\) \([0-9.]\+\)/[\2,\1]/g;s/;/,/g' < input.csv > output.csv
メタ文字として扱うには、角かっこ内のバックスラッシュと一致する+
パターン(および代替数字)が必要です。sed
スクリプトは、1 行に 2 つの徹底した代替項目で構成されます。まず、空白で区切られ、カンマで区切られ、かっこで囲まれた2つの数字と点のシーケンスを逆順に置き換え、2番目はセミコロンをカンマで置き換えます。
,
ただし、出力の二重使用はCSVに簡単にロードできない可能性があります。
答え3
perl -F'\s+|;' -pale '$" = ",";
$_ = "$F[0],[" . join("],[", map { "@F[2*$_,2*$_-1]" } 1 .. @F/2) . "]";
' yourfile
単に
The field separator are set at multiple whitespaces or semicolon. Then
excepting for the 1st field, the rest come in pairs. So keeping aside
($F[0]) we look at 2 fields at a time, flip them, & join all these pairs
with "],[".