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

use*_*394 26 command-line shell text-processing

我正在编写一个 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

roz*_*acz 36

如果您不想搞砸,但仍要使用tailand 进行操作head,则有一种tail从头而不是末尾使用行数进行调用的有用方法:

tail -n +4001 yourfile | head -4000
Run Code Online (Sandbox Code Playgroud)

......但是一个更好的,专门用于分割文件的自动工具被称为...... split!它也是 GNU coreutils 的一部分,所以任何普通的 Linux 系统都应该拥有它。使用方法如下:

split -l 4000 yourInputFile thePrefixForOutputFiles
Run Code Online (Sandbox Code Playgroud)

man split如有疑问,请查看。)


Sor*_*gal 26

像你一样结合头部和尾部会起作用,但为此我会使用 sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file
Run Code Online (Sandbox Code Playgroud)

这使您可以使用快速的 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
Run Code Online (Sandbox Code Playgroud)

现在你有 your_file.1-4000 和 yuor_file.4001-8000 等等。

注意:需要 bash

  • 我喜欢 sed 方式。 (3认同)