我有一个以下格式的大文件:
From fc2868d745defcc4deb0ebdce8fe8dac78b447ea Mon Sep 17 00:00:00 2001
From: email address
message content
From 39a833c2f01030619629daa3b613e3985b2e4e7a Mon Sep 17 00:00:01 2001
From: email address
message content
From 833c2f01030619629daa3b613e3985b2e4e7a427 Mon Sep 17 00:00:01 2001
From: email address
message content
我想将文件拆分为多个文件,因此第一个文件包含
From fc2868d745defcc4deb0ebdce8fe8dac78b447ea Mon Sep 17 00:00:00 2001
From: email address
message content
下一个文件包含下一部分。
决定下一个文件的键是“From [a-z][0-9]”
所以“来自太空的一些字母/数字”
消息内容多行,最多1000行
有什么想法如何在 bash 中做到这一点吗?
包含 3 条消息的示例:http://pastebin.com/xWmuzfRC
#script 20151110f.sh
#input file: 20151110f.dat
#usage bash 20151110f.sh 20151110f.dat
inf=$1 # source file
num=1
while read -r line
do
echo "$line" | grep -q "From [a-z0-9]" # check if a new message
if [ $? -eq 0 ]
then
file="file"${num}.dat
echo "$line" > $file
num=$((num + 1)) #inc so that next file name will be one higher
else
echo "$line" >> $file
fi
done < "$inf"
你可以使用这个awk:
awk '/^From [[:alnum:]]+/{if (fn) close (fn); fn = "file" ++i ".txt"}
{print > fn} END{close(fn)}' file
这将创建输出文件为
file1.txt
、file2.txt
、file3.txt
。
以下模式将起作用:
(^From.*\n)(From:.*\n)((?!From)[\s\S])*$
From
开头的所有内容,直到当前行的末尾。From:
开头的所有内容,直到当前行的末尾。From
之外。Aaaghh...原来大文件来自 git,可以用
git mailsplit
进行分割:)
git 邮件分割 将 mbox 文件或 Maildir 拆分为文件列表:“0001”“0002”.. 在指定目录中,以便您可以从那里进一步处理它们。
https://git-scm.com/docs/git-mailsplit
每条消息的第一行是标识该消息的魔术字符串 作为 git(1) 输出:
From fc2868d745defcc4deb0ebdce8fe8dac78b447ea Mon Sep 17 00:00:00 2001
[参见][参见]
假设文件
mails.txt
与答案中的相同。
mkdir output.d
git mailsplit -ooutput.d mails.txt
这将在目标中创建三个文件(电子邮件)
output.d
目录:0001
、0002
、0003
。
$ cat output.d/0001
From fc2868d745defcc4deb0ebdce8fe8dac78b447ea Mon Sep 17 00:00:00 2001
From: email address
message content
这些电子邮件是由 git(1) 创建的,大概是专门针对 git 格式补丁 (1)。因此“消息内容”可能是 占位符和这些电子邮件在现实世界中将包含 补丁(提交消息加上更改(适当的补丁))。
[参见][参见]:https://stackoverflow.com/a/15790338/1725151