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


17

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

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

我可以得到的第一部分head -4000 file.txt。中间部分比较棘手-我正在考虑将tail输出传递到headtail -4001 file.txt | head -4000 > section2.txt),但是还有另一种/更好的方法吗?

实际上,我的逻辑搞砸了–对于第二部分,我将需要类似的内容tail -12001 file.txt | head - 4000,然后降低下一部分的tail参数。我已经很困惑了!:P

Answers:


27

如果您不想弄乱,但仍使用tail和进行操作head,则有一种有用的方法可以tail从头开始而不是从尾开始使用行数进行调用:

tail -n +4001 yourfile | head -4000

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

split -l 4000 yourInputFile thePrefixForOutputFiles

(看看man split是否有疑问。)


19

像您那样组合头部和尾部将起作用,但是为此我将使用 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
我喜欢sed方式。
fanchyna '16

这对我不起作用,因为sed不会退出。它打印出我要输出的行,但是我必须ctrl-c输出,因此,我无法将其重定向到文件。有什么建议使其可用吗?
布伦特212年

弄清楚了!“ sed -n'<开始行>,<结束行> w <输出文件>'<输入文件>”对我有用。
布伦特212年

@ Brent212要注意的另一种选择是,您也可以将其通过管道传输到更少的文件中,或将输出重定向到文件。
凯尔的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.