Разбиение файла на две части на основе определенной строки

Мне нужно разбить файл на два отдельных файла на основе определенной строки, например:

. . sc_outfifo 0.000E+00 0.000E+00 0.000E+00 0.000E+00 1.586E-02 1.586E-02 1.586E-02 Fub_Level_DACGE(%) PS0_SI.0 PS0_SI.0 PS0_SI.0 PS1_SI.0 PS1_SI.0 siunit 98.91 98.81 98.91 90.06 96.37 81.37 81.37 16655 . . 

Таким образом, все строки выше Fub_Level_DACGE(%) идут в одном файле, а остальные, включая Fub_Level_DACGE(%) идут в другом файле. Любая идея, как это можно сделать?

Утилита, которая на самом деле предназначена для этого, – csplit

 NAME csplit - split a file into sections determined by context lines SYNOPSIS csplit [OPTION]... FILE PATTERN... 

Итак, в этом случае

 csplit file /Fub_Level_DACGE\(%\)/ 

будет создавать файлы xx00 и xx01 содержащие две части.

Это будет читать файл file0 и записывать его строки в file1 до тех пор, пока Fub_Level_DACGE будет достигнута линия, начинающаяся с Fub_Level_DACGE . Начиная с этой строки, все строки записываются в file2 :

 awk -vf=file1 '/^Fub_Level_DACGE/{f="file2"} {print>f}' file0 

Как это работает

  • -vf=file1

    Установите переменную f в имя исходного выходного файла file1 .

  • /^Fub_Level_DACGE/{f="file2"}

    Когда мы дойдем до строки, которая начинается Fub_Level_DACGE , назначьте f имя второго выходного файла file2 .

  • print>f

    Запишите текущую строку в файл, чье имя находится в f .