使用 sed 或 awk 使用一行的前 X 位置将一个文件拆分为多个文件

使用 sed 或 awk 使用一行的前 X 位置将一个文件拆分为多个文件

我有一个很大的文本文件,最多包含 2300 个部分。每个部分在前一行开始,“PAGE 1”页码位于该行的最末尾,

例子:

T5271-AX1   TITLE                             DATE
     SUB TITLE                                PAGE   1
LINE1
LINE2                                
T5271-AX1   TITLE                             PAGE   2
LINE3
LINE4
     SUB TITLE                                PAGE   3
LINE5
T5271-BX1                                     DATE
     SUB TITLE                                PAGE   1
LINE1

该文件最多有 2300 个部分,每个部分可以有数百页,但部分在行末尾始终有“PAGE 1”。

文件名包含在“PAGE 1”上方行的第一个 9-15 个字符的字符串中

我想在“PAGE 1”处分割文件并在输出文件名中使用 9-15 个字符。

在我的示例中,最终结果将是两个文件:

T5271-AX1
T5271-BX1

我可以轻松找到页码和标题,但我不知道如何拆分文件并将其输出到新文件中,直到下一次出现“PAGE 1”。

任何帮助,将不胜感激

答案1

$ cat tst.awk
/ PAGE   1$/ {
    close(out)
    split(prev,p)
    out = p[1]
}
NR > 1 { print prev > out }
{ prev = $0 }
END { print prev > out }

$ awk -f tst.awk file

$ head T*
==> T5271-AX1 <==
T5271-AX1   TITLE                             DATE
     SUB TITLE                                PAGE   1
LINE1
LINE2
T5271-AX1   TITLE                             PAGE   2
LINE3
LINE4
     SUB TITLE                                PAGE   3
LINE5

==> T5271-BX1 <==
T5271-BX1                                     DATE
     SUB TITLE                                PAGE   1
LINE1

答案2

该命令csplit,对于语境split,会做你所要求的。

csplit -sz file '/ PAGE   1$/-1' '{*}'
for  f in xx*;do
  mv -f -- "$f" "$(< "$f" head -n1 | cut -f1 -d" ")"
done

相关内容