【发布时间】:2021-01-26 00:16:52
【问题描述】:
我有一个文本文件,其中包含多个 (~80) 个连接在一起的 OneNote 页面,我试图将其拆分为每个页面的组件文件。我试图通过页面标题的行号来做到这一点,因为页面的长度是可变的,虽然我已经能够将行号提取到一个单独的文件中,但我无法弄清楚如何与他们分手。例如
日志.txt:
Tuning //Page Title
09 November 2016 //Date
23:19 //Time
Content text... //Page Content
Week 46 //Another title, want to split here
14 November 2016
13:47
Text..
More text... //Content can be over multiple lines
Week 47 //Another title, want to split here
22 November 2016
11:15
Text
etc...
单独文件中的行号: Lines.txt:
1
7
14
此示例中的预期输出将提供三个文件,每个文件从页面标题向下到下一页标题之前的最后一行。
log1.txt log2.txt log3.txt
$ cat log1.txt
Tuning
09 November 2016
23:19
Content text...
$
我找到了很多关于拆分为固定块(例如每 50 行)的答案,因为这些部分的长度可变,所以在这里不起作用。大多数以固定行号拆分的人只处理几个可以硬编码的行号,例如using head or tail commands.
This answer 非常接近我正在寻找的内容,但是要拆分的行号的输入再次非常小,可以直接写入命令中。我不知道如何使用行号文件代替将其写入字符串“1 7 14”等。
我在 macos 上使用 bash,并且对命令行中的这一级别的工作非常陌生,并且没有使用 grep、sed、awk 等的实际经验,所以我很难概括这个特殊情况的其他答案.
PS 如果需要,我可以包含用于获取行号的代码,尽管我确信它远非最佳。 (它涉及使用正则表达式查找时间戳的行号,然后剥离匹配的文本并从每行中减去 2 以获得页面标题)
【问题讨论】:
-
所以你希望第 1-6 行作为一个文件,第 7-13 行作为另一个文件,第 14 行作为第三个文件?或者你想要一些动态的东西,在你的脚本前面提供了用于剪切文件的行号?
-
您链接的答案正是您正在寻找的。您只需将
<(printf '%s\n' $vec)替换为您保存行号的文件,例如awk '...' lines.txt log.txt。 -
@oguzismail 感谢您的解释,我不知道
<(printf ...)语句在做什么,但我现在看到我的行文件应该能够插入。但是当我尝试使用与该替换相同的解决方案它没有输出或错误,并且不写入任何新文件。 -
这里工作正常。我将
7和14分别放入名为lines.txt的文件中,并将示例输入从您的问题复制到名为log.txt的文件中。然后我运行awk '...' lines.txt log.txt,它创建了log.txt.1、log.txt.2和log.txt.3。你做了什么与我描述的不同的事情吗?