如何使用bash命令分割交错文本文件

时间:2019-01-31 22:13:43

标签: bash text split

我想将一个文本文件拆分为多个单个文件。由于该命令将在远程群集上执行,因此我正在寻找用于该作业的简单bash命令。

文件结构由标头和隔行数据组成。 标题是一行,其中有用于测量数据的探针数(N),而N行是具有探针位置(坐标)的线。

然后,在每次调用时,在N行中附加测量数据(时间,速度(x,y,z),压力,温度)。

总体结构:

N
x1 y1 z1
x2 y2 z2
x3 y3 z3
...
xN yN zN
time1 vx1 vy1 vz1 pr1 tmp1
time1 vx2 vy2 vz2 pr2 tmp2
time1 vx3 vy3 vz3 pr3 tmp3
...
time1 vxN vyN vzN prN tmpN
time2 vx1 vy1 vz1 pr1 tmp1
time2 vx2 vy2 vz2 pr2 tmp2
time2 vx3 vy3 vz3 pr3 tmp3
...
time2 vxN vyN vzN prN tmpN
time3 vx1 vy1 vz1 pr1 tmp1
time3 vx2 vy2 vz2 pr2 tmp2
....

,并且一直持续到运行时结束。

我想将此文件拆分为N个单独的文本文件,每个探针一个,如下所示:

time1 vx1 vy1 vz1 pr1 tmp1
time2 vx1 vy1 vz1 pr1 tmp1
time3 vx1 vy1 vz1 pr1 tmp1
time4 vx1 vy1 vz1 pr1 tmp1
....

具有3个探针的输出的第一行:

   3
0.0250 0.5000 0.1250
0.0500 0.5000 0.1250
0.1250 0.5000 0.1250
  0.0000000E+00 -1.1340826E-03  6.9640250E-02  1.6186548E-05 -4.0954774E-02 -1.5523269E-02
  0.0000000E+00 -1.5596009E-03 -3.4286277E-02  9.0128932E-05 -4.0959023E-02  6.9194414E-03
  0.0000000E+00 -3.9384158E-05 -2.2799330E-05  1.1221853E-05 -4.0955983E-02 -1.2640788E-06
  4.0196506E-02 -1.6982891E-03  6.9905423E-02  2.3351709E-05 -3.9776587E-02 -1.6820817E-02
  4.0196506E-02 -1.0372577E-03 -3.4509494E-02  6.3698954E-05 -3.9868597E-02  7.5963487E-03
  4.0196506E-02 -6.5377012E-05  3.3921110E-05  3.1376311E-05 -4.0054469E-02  1.0799556E-05
  8.0393012E-02 -1.6714063E-03  7.0387993E-02  1.5038874E-05 -4.0916789E-02 -1.8516903E-02
  8.0393012E-02 -1.1169951E-03 -3.4756862E-02  4.9885574E-05 -4.0875671E-02  8.4853258E-03
  8.0393012E-02 -9.1204643E-05  2.6588890E-05  2.1999171E-05 -4.0515620E-02  1.9732526E-05
  1.2058952E-01 -1.6174557E-03  7.0969499E-02  1.3969087E-05 -3.9974914E-02 -2.0067937E-02
  1.2058952E-01 -1.1945215E-03 -3.4945342E-02  4.9125530E-05 -3.9976085E-02  9.3101819E-03
  1.2058952E-01 -8.3691302E-05  1.0623141E-05  6.2817857E-06 -3.9872920E-02  3.0225340E-05
  1.6078602E-01 -1.5857685E-03  7.1464134E-02  1.4791469E-05 -4.0061323E-02 -2.1601683E-02
  1.6078602E-01 -1.2624167E-03 -3.5139814E-02  5.0977166E-05 -4.0052185E-02  1.0136956E-02
  1.6078602E-01 -6.9232853E-05 -1.8374514E-06 -8.4810929E-06 -3.9979475E-02  4.0127930E-05

2 个答案:

答案 0 :(得分:0)

您可以这样做:

read n < infile
for ((i = 0; i < n; ++i)); do
    sed -n "$((n+2+i))~${n}p" infile > "outfile$i.txt"
done

这会将输入文件的第一行读入n,修剪空格,因此在示例中它将包含3

然后它在01,...,n-1上循环,因此例如:01,{{1} },将2设置为该值。 sed命令扩展为:

i

其中第一行地址是sed -n '5~3p' infile > outfile0.txt sed -n '6~3p' infile > outfile1.txt sed -n '7~3p' infile > outfile2.txt 的结果,而n+2+i3的值。用$n抑制匹配行以外的行的输出。输出文件使用-n的值编号。

请注意,用于地址i(从第n~m行开始,然后每第n行命中)的sed构造需要GNU sed。

答案 1 :(得分:0)

您可以尝试

awk 'NR==1 {n=$1} NR<=(n+1) {next} {print > sprintf("probe%d",NR%n+1)}' infile

这将读取infile,并生成具有相应行的probeN文件。 这只是一个过程,如果您有大文件,那将会有所作为。