![提取文本文件行的中间部分?](https://linux22.com/image/18734/%E6%8F%90%E5%8F%96%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E8%A1%8C%E7%9A%84%E4%B8%AD%E9%97%B4%E9%83%A8%E5%88%86%EF%BC%9F.png)
我正在编写一个 PHP 脚本来解析一个大文本文件以从中进行数据库插入。然而在我的主机上,文件太大,并且达到了 PHP 的内存限制。
该文件大约有16,000行;我想将其分成四个单独的文件(首先),看看是否可以加载它们。
我可以得到的第一部分head -4000 file.txt
。中间部分有点棘手——我正在考虑将输出管道传输tail
到head
( tail -4001 file.txt | head -4000 > section2.txt
) 中,但是还有其他/更好的方法吗?
实际上我的逻辑很混乱——对于第二节,我需要这样的东西tail -12001 file.txt | head - 4000
,然后降低tail
下一节的论点。我已经搞混了! :P
答案1
如果您不想搞砸,但仍然使用tail
and进行操作head
,则有一种有用的方法可以tail
从开头而不是末尾使用行计数来调用:
tail -n +4001 yourfile | head -4000
...但是一个更好的、专门用于分割文件的自动工具叫做...split
!它也是 GNU coreutils 的一部分,因此任何普通的 Linux 系统都应该有它。使用方法如下:
split -l 4000 yourInputFile thePrefixForOutputFiles
(看看man split
是否有疑问。)
答案2
像你一样组合头部和尾部是可以的,但为此我会使用sed
sed -n '1,4000p' input_file # print lines 1-4000 of input_file
这可以让您通过快速 shell 功能解决您的问题
chunk_it(){
step=4
start=1
end=$step
for n in {1..4} ; do
sed -n "${start},${end}p" "$1" > "$1".$start-$end
let start+=$step
let end+=$step
done
}
chunk_it your_file
现在您有 your_file.1-4000 和 yuor_file.4001-8000 等等。
注意:需要bash
答案3
您还可以使用bat
喜欢
bat -r 4001:8000 input-file.txt >output-file-1.txt
好处是您可以省略输出重定向来了解正在写入的内容:
注意:安装可能有点过分bat
只是对于此功能;如果您由于某种原因已经安装了它,那么这个答案很有用。