Text 在仅包含一个整数的两个连续行上拆分文本文件

Text 在仅包含一个整数的两个连续行上拆分文本文件,text,awk,split,csplit,Text,Awk,Split,Csplit,我有一个长文本文件,其中包含一个os 3D坐标列表。文件的开头由如下标题组成: 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.000

我有一个长文本文件,其中包含一个os 3D坐标列表。文件的开头由如下标题组成:

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
...
列表的总长度等于头两个数字的乘积(10112*2455)。这些是PTX文件,包含文本格式的激光扫描的3D点

关键是文件是标题和坐标的串联,我想分割文件,在标题上打断它。理想的解决方案是在两个连续的单整数行上拆分文件。我正在寻找一个通用的解决方案,例如使用csplit,但是csplit一次读取一行,所以它无法检测到两个连续的行

作为最后的手段,我将自己编写一个软件,但我更愿意找到一个基于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
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因此,您希望将一个文件拆分为不同的文件,并在所有文件中打印标题

这可以做到,您只需指定要存储在参数
-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

如果要为找到的每个头拆分文件,则应执行以下操作: 解释
  • (!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}
    如果设置了该标志,则表示我们已经捕获了头的第一行,并且我们位于第二行。为此,取消设置该标志,将文件名生成为
    output\uu
    +
    number
    ,并用存储的头填充
  • {print>file}
    在其余的案例中,将当前行打印到文件中
给定示例文件,它将返回
output_1
output_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

多谢各位。但我需要保留原始文件的所有内容,只是将其拆分为不同的文件。原始文件需要在每个标题前剪切。@FedericoRusso然后用一些示例代表性输入和所需输出更新您的问题。现在还不太清楚你的意思。你的意思是在同一个文件中有许多头文件,你想以此为基础打破吗?没错。我只需要在每次出现类似于头的内容之前分割原始文件,头从两行开始,每行由一个整数组成。
$ 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
$ 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