将文件分割成多个文件

问题描述 投票:0回答:5

我有一个以下格式的大文件:

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

regex bash
5个回答
2
投票
#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"

2
投票

你可以使用这个awk:

awk '/^From [[:alnum:]]+/{if (fn) close (fn); fn = "file" ++i ".txt"}
          {print > fn} END{close(fn)}' file

这将创建输出文件为

file1.txt
file2.txt
file3.txt


0
投票

也许你可以使用这个正则表达式。

(From\s.*\n+From:\s+.*\n+.*\n)

看这个例子: https://regex101.com/r/fJ2rF9/1


0
投票

以下模式将起作用:

(^From.*\n)(From:.*\n)((?!From)[\s\S])*$
  • 第 1 组:匹配以
    From
    开头的所有内容,直到当前行的末尾。
  • 第 2 组:匹配以
    From:
    开头的所有内容,直到当前行的末尾。
  • 第 3 组:匹配所有内容,包括换行符,除了
    From
    之外。

0
投票

Aaaghh...原来大文件来自 git,可以用

git mailsplit
进行分割:)

git 邮件分割 将 mbox 文件或 Maildir 拆分为文件列表:“0001”“0002”.. 在指定目录中,以便您可以从那里进一步处理它们。

https://git-scm.com/docs/git-mailsplit

Git 电子邮件输出标识符

每条消息的第一行是标识该消息的魔术字符串 作为 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

© www.soinside.com 2019 - 2024. All rights reserved.