提取文本文件行的中间部分?

提取文本文件行的中间部分?

我正在编写一个 PHP 脚本来解析一个大文本文件以从中进行数据库插入。然而在我的主机上,文件太大,并且达到了 PHP 的内存限制。

该文件大约有16,000行;我想将其分成四个单独的文件(首先),看看是否可以加载它们。

我可以得到的第一部分head -4000 file.txt。中间部分有点棘手——我正在考虑将输出管道传输tailhead( tail -4001 file.txt | head -4000 > section2.txt) 中,但是还有其他/更好的方法吗?

实际上我的逻辑很混乱——对于第二节,我需要这样的东西tail -12001 file.txt | head - 4000,然后降低tail下一节的论点。我已经搞混了! :P

答案1

如果您不想搞砸,但仍然使用tailand进行操作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 项目规范

注意:安装可能有点过分bat 只是对于此功能;如果您由于某种原因已经安装了它,那么这个答案很有用。

相关内容