Как разделить текстовый файл с чередованием, используя команды bash - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу разбить текстовый файл на несколько отдельных файлов.Поскольку команда будет выполняться на удаленном кластере, я рассматриваю простые команды 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 голосов
/ 01 февраля 2019

Вы можете попробовать это

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

, это читает infile и генерирует probeN файлы с соответствующими строками.Это всего лишь 1 процесс, если у вас большие файлы, это будет иметь значение.

0 голосов
/ 01 февраля 2019

Вы можете сделать это следующим образом:

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

Это читает первую строку вашего входного файла в n, обрезая пробелы, поэтому для примера он будет содержать 3.

Затем выполняется цикл по 0, 1, ..., n-1, поэтому для примера: 0, 1, 2, установка i в это значение.Команда sed раскрывается следующим образом:

sed -n '5~3p' infile > outfile0.txt
sed -n '6~3p' infile > outfile1.txt
sed -n '7~3p' infile > outfile2.txt

, где адрес первой строки - это результат n+2+i, а 3 - это значение $n.Вывод для строк, отличных от совпадающих, подавляется с помощью -n.Выходные файлы нумеруются с использованием значения i.

Обратите внимание, что эта конструкция sed для адресов, n~m (начинается со строки n, затем ударяется по каждой m -ой строке), требует GNU sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...