0

3D 座標のリストを含む 1 つの長いテキスト ファイルがあります。ファイルの先頭は、次のようなヘッダーで構成されています。

10112
2455
121.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
121.417670 172.321300 1.704072 1

その後、座標のリストを開始します。すべての行は 3 ~ 7 個の数字で構成されています。例えば:

0.001686 0.812066 -1.686245 0.074434
0.001695 0.816359 -1.692300 0.087190
0.001699 0.818673 -1.694508 0.097398
...

リストの全長は、ヘッダーの最初の 2 つの数値の積 (10112*2455) に等しくなります。これらは PTX ファイルで、レーザー スキャンからの 3D ポイントがテキスト形式で含まれています。

ポイントは、ファイルがヘッダーと座標の連結であり、ファイルを分割してヘッダーで分割したいということです。理想的な解決策は、ファイルを 2 つの連続する単一整数行に分割することです。csplit などを使用して一般的なソリューションを探していましたが、csplit は一度に 1 行ずつ読み取るため、連続する 2 行を検出できません。

最後の手段として、自分でソフトウェアを作成しますが、可能な場合は CLI ツール (Awk?) に基づくソリューションを見つけることを好みます。

アイデアはありますか?

ありがとうございました

編集:例

次の内容のファイルがあるとします。

2
3
121.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
121.417670 172.321300 1.704072 1
6.001686 0.812066 -1.686245 0.074434
3.001695 0.816359 -1.692300 0.087190
6.001699 0.818673 -1.694508 0.097398
2.001686 0.812066 -1.686245 0.074434
1.001695 0.816359 -1.692300 0.087190
0.001699 0.818673 -1.694508 0.097398
3                                         <--- cut before this line
1
421.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
421.417670 172.321300 1.704072 1
1.001686 0.812066 -1.686245 0.074434
2.001695 0.816359 -1.692300 0.087190
3.001699 0.818673 -1.694508 0.097398

この場合、1 つの整数で構成される 2 つの行の最初の行の直前で、2 つのファイルが作成されます。

別の方法として、セクションを構成するポイントの数が 2 つの単数行で示されていることを知っていれば、最初の出力ファイルは最初の 2*3+10=16 (ヘッダーの 10 行とデータの 6 行) 行で構成されていると言えます。 、および 2 番目のファイルは、後続の 3*1+10=13 (常にヘッダーの 10 行、今回はデータの 3 行) 行で構成されます。

4

1 に答える 1

1

したがって、ファイルを別々のファイルに分割し、それらすべてにヘッダーを出力したいとします。

これで実行できます。パラメーターに格納する行数と、格納する-v lines=XXヘッダーの行数を割り当てるだけです-v head=YY

awk -v lines=5 -v head=2
     'NR<=head{header[NR]=$1; next}
      !((NR-3)%lines) {file="output_"++count; for (i=1;i<=head;i++) print header[i] > file}
      {print > file}
     ' file

一発ギャグ:

awk -v lines=5 -v head=2 'NR<=head{header[NR]=$1; next} !((NR-3)%lines) {file="output_"++count; for (i=1;i<=head;i++) print header[i] > file} {print > file}' file

特定のサンプル入力に対してhead=2とを指定するとlines=5、次の 2 つのファイルが返されます。

$ cat output_1
10112
2455
121.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
$ cat output_2
10112
2455
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
121.417670 172.321300 1.704072 1

見つけたヘッダーごとにファイルを分割したい場合は、次のようにします。

awk '(!flag && NF==1) {header[1]=$1; flag=1; next} (flag && NF==1) {header[2]=$1; flag=0; file="output_"++count; printf "%d\n%d\n", header[1], header[2] > file; next} {print > file}' file

説明

  • (!flag && NF==1) {header[1]=$1; flag=1; next}フラグが設定されていない場合は、ヘッダーの最初の行であると想定して保存します。
  • ( flag && NF==1) {header[2]=$1; flag=0; file="output_"++count; printf "%d\n%d\n", header[1], header[2] > file; next}フラグが設定されている場合は、ヘッダーの最初の行を既にキャプチャしており、2 番目の行にいることを意味します。このために、フラグの設定を解除し、ファイル名をoutput_+としてnumber生成し、保存されたヘッダーを入力します。
  • {print > file}残りの場合、現在の行をファイルに出力します。

サンプル ファイルを指定すると、次のように返さoutput_1output_2ます。

$ cat output_1
2
3
121.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
121.417670 172.321300 1.704072 1
6.001686 0.812066 -1.686245 0.074434
3.001695 0.816359 -1.692300 0.087190
6.001699 0.818673 -1.694508 0.097398
2.001686 0.812066 -1.686245 0.074434
1.001695 0.816359 -1.692300 0.087190
0.001699 0.818673 -1.694508 0.097398
$ cat output_2
3
1
421.417670 172.321300 1.704072
0.997697 0.067831 -0.000222
-0.067831 0.997697 0.000207
0.000236 -0.000191 1.000000
0.997697 0.067831 -0.000222 0
-0.067831 0.997697 0.000207 0
0.000236 -0.000191 1.000000 0
421.417670 172.321300 1.704072 1
1.001686 0.812066 -1.686245 0.074434
2.001695 0.816359 -1.692300 0.087190
3.001699 0.818673 -1.694508 0.097398
于 2014-09-17T12:18:04.697 に答える