![将大型 txt 文件每 100 行拆分一次并包含原始标题(在 Mac 上)](https://linux22.com/image/1250644/%E5%B0%86%E5%A4%A7%E5%9E%8B%20txt%20%E6%96%87%E4%BB%B6%E6%AF%8F%20100%20%E8%A1%8C%E6%8B%86%E5%88%86%E4%B8%80%E6%AC%A1%E5%B9%B6%E5%8C%85%E5%90%AB%E5%8E%9F%E5%A7%8B%E6%A0%87%E9%A2%98%EF%BC%88%E5%9C%A8%20Mac%20%E4%B8%8A%EF%BC%89.png)
我正在寻找一个工具或脚本(Textwrangler 或 Terminal),它可以从第 5 行开始每 100 行拆分一个较大的文本文件(前 4 行是标题行)并输出包含原始标题的单独 .txt 文件。
例如
输入:
File.txt
line1 / line4 HEADER
...
line5 / line265 DATA
输出:
File_01.txt
line1/line4 HEADER
line5/line104 DATA
File_02.txt
line1/line4 HEADER
line5/line104 DATA
File_03.txt
line1/line4 HEADER
line5/line65 DATA
文本文件使用 Windows 换行符 (CR LF),以防万一。
我目前正在手动执行此操作,因此非常欢迎任何可以使此过程更高效的建议。
答案1
- 删除标题并将其放入单独的文件中
header.txt
。 - 分裂使用的数据
split --lines=100 data.txt
(这会生成许多文件,每个文件有 100 行,名为 xaa xab xac 等等) - 然后将标题添加到每个文件
for a in x??; do cat header.txt $a > $a.txt; done
这会导致您的完成的数据文件(带有标题)被称为xaa.txt xab.txt xac.txt ...
如果数据量太大(或者您拆分成较少的行),xxx 文件不够,则拆分为四个字母命名的文件。在这种情况下,请?
在for
上面的 -statement 中插入一个额外的内容。
编辑:
要自动提取标题,请使用head -4 origdata.txt > header.txt
提取前四行。使用tail -n +4 origdata.txt > data.txt
提取除前四行之外的所有内容。现在您有两个文件,一个包含标题,一个包含数据。将其合并到脚本中应该不太难。(我今天无法访问 bash)
答案2
根据 Nifle 提供的答案,我编写了一个脚本,执行他建议的命令,将原始文件名添加到输出并清理临时文件。
#!/bin/bash
FILE=$(ls -1 | grep filename.txt)
NAME=${FILE%%.txt}
head -4 $FILE > header.txt
tail -n +5 $FILE > data.txt
split -l 100 data.txt
for a in x??
do
cat header.txt $a > $NAME.$a.txt
done
mv $FILE $NAME.orig.txt
rm header.txt data.txt x??
瞧!