Shell

提取文本文件的中間部分?

  • March 9, 2022

我正在編寫一個 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

如果你不想搞砸但仍然使用tailand head,有一種有用的方法是tail從頭開始使用行數呼叫,而不是結束:

tail -n +4001 yourfile | head -4000

…但是,一個更好的、自動的工具被稱為…… split!它也是 GNU coreutils 的一部分,所以任何普通的 Linux 系統都應該有它。以下是您可以使用它的方法:

split -l 4000 yourInputFile thePrefixForOutputFiles

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

像你一樣結合頭部和尾部會起作用,但為此我會使用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

引用自:https://unix.stackexchange.com/questions/22623