我想将文件拆分为多个文件。我的意见是
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
但我没有得到合适的输出。
任何指导都将不胜感激。
答案 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}
将每行打印到文件中。
例如,如果filename
为1
,则此行与
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