bash スクリプトを使用して、巨大なテキスト ファイルから最初の行を繰り返し削除する必要があります。
現在使用していますsed -i -e "1d" $FILE
が、削除には約 1 分かかります。
これを実現するより効率的な方法はありますか?
ベストアンサー1
試すしっぽ:
tail -n +2 "$FILE"
-n x
: 最後のx
行だけを印刷します。tail -n 5
は、入力の最後の 5 行を表示します。符号は+
引数を反転し、tail
最初の行以外のすべてを印刷します。は、ファイル全体、つまり最初の行以外のすべてを印刷しますx-1
。tail -n +1
tail -n +2
GNUはtail
よりはるかに高速ですsed
。BSDtail
でも利用可能で、-n +2
フラグは両方のツールで一貫しています。フリーBSDまたはOS X詳細については man ページを参照してください。
ただし、BSD バージョンは よりもずっと遅くなる可能性がありますsed
。 どうやってそれを実現したのか不思議です。 は、スクリプトの解釈、正規表現の適用など、かなり複雑な操作を実行するのに対しtail
、 はファイルを 1 行ずつ読み取るだけでよいはずです。sed
注: 使用したいと思われるかもしれません
# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"
しかし、これでは空のファイルが生成されます。その理由は、シェルによって が呼び出される前にリダイレクト ( >
) が行われるためです。tail
- シェルがファイルを切り捨てる
$FILE
- シェルは新しいプロセスを作成します
tail
tail
シェルはプロセスのstdoutをリダイレクトします$FILE
tail
今は空から読み取る$FILE
ファイル内の最初の行を削除する場合は、次のようにします。
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
&&
問題が発生した場合にファイルが上書きされないようにします。