如何将文件拆分为多个文件?

时间:2015-01-05 09:59:22

标签: linux unix awk

我想将文件拆分为多个文件。我的意见是

Report : 1
ABC
DEF
GHI
JKL
   End of Report
$
Report : 2
ABC
DEF
GHI
JKL
$
Report : 2
ABC
DEF
GHI
JKL
   End of Report  
$
Report : 3
ABC
DEF
GHI
JKL
   End of Report
$

输出应为:

档案1

Report : 1
ABC
DEF
GHI
JKL
   End of Report
$

文件2

Report : 2
ABC
DEF
GHI
JKL
$
Report : 2
ABC
DEF
GHI
JKL
   End of Report  
$

档案3

Report : 3
ABC
DEF
GHI
JKL
   End of Report
$

我试过了

awk '{print $0 "Report :"> "/tmp/File" NR}' RS="END OF" test.txt

但我没有得到合适的输出。

任何指导都将不胜感激。

3 个答案:

答案 0 :(得分:6)

您可以尝试类似

的内容
$awk '/^Report/{filename++} {print > "FILE"filename}' input

<强>测试

$awk '/^Report/{filename++} {print > "FILE"filename}' input

$ cat FILE1
Report : 1
ABC
DEF
GHI
JKL
   End of Report
$

$ cat FILE2
Report : 2
ABC
DEF
GHI
JKL
$
Report : 2
ABC
DEF
GHI
JKL
   End of Report
$

$ cat FILE3
Report : 3
ABC
DEF
GHI
JKL
   End of Report
$

它的作用

    对于以/^Report/开头的行,
  • Report模式为true,同一行中第三列中的数字是必须用作下几行的文件名的文件名

  • {filename++}将文件名值增加一个

  • {print > "FILE"filename}将每行打印到文件中。

    例如,如果filename1,则此行与

    相同
    print > FILE1
    

    这是输出重定向,与bash等中使用的重定向相同。

    请注意,如果遗漏了属性,则print没有属性,然后awk打印整个记录。这与撰写print $0 > "FILE"filename

  • 相同

答案 1 :(得分:5)

试试这个,

csplit input.txt '/End of Report$/' '{*}'

解释

  • csplit是一个UNIX实用程序,用于将文件拆分为由上下文行确定的两个或多个较小的文件。

  • input.txt这是将要分割的文件。

  • '/End of Report$/'具体模式,如“报告结束”。

  • '{*}'选项,表示整个文件。

答案 2 :(得分:1)

这是另一个awk答案:

awk '/^Report/{n=$3} {print > "File"n}' input

这类似于nu11p01n73R的答案,但使用每个Report行的第三个字段来确定文件编号。

  • /^Report/与该行匹配时,将n设置为$3
  • 创建文件名时使用n将每行打印到

如果您拥有大量这些块,则可能需要最终关闭文件并改为使用此命令:

awk '/^Report/{f="File"$3; if(lf != f) {close(lf); lf=f}} {print > f}' input
  • /^Report/与该行匹配时,请创建文件名f
  • 如果lf(最后一个文件名)与f不匹配,请先尝试关闭lf,然后重置lf。在未设置lf时调用close()是安全的
  • 将每一行打印到f