bash/sed スクリプトを使用してテキストファイルの最初の行を削除するにはどうすればいいですか? 質問する

bash/sed スクリプトを使用してテキストファイルの最初の行を削除するにはどうすればいいですか? 質問する

bash スクリプトを使用して、巨大なテキスト ファイルから最初の行を繰り返し削除する必要があります。

現在使用していますsed -i -e "1d" $FILEが、削除には約 1 分かかります。

これを実現するより効率的な方法はありますか?

ベストアンサー1

試すしっぽ:

tail -n +2 "$FILE"

-n x: 最後のx行だけを印刷します。tail -n 5は、入力の最後の 5 行を表示します。符号は+引数を反転し、tail最初の行以外のすべてを印刷します。は、ファイル全体、つまり最初の行以外のすべてを印刷しますx-1tail -n +1tail -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

  1. シェルがファイルを切り捨てる$FILE
  2. シェルは新しいプロセスを作成しますtail
  3. tailシェルはプロセスのstdoutをリダイレクトします$FILE
  4. tail今は空から読み取る$FILE

ファイル内の最初の行を削除する場合は、次のようにします。

tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"

&&問題が発生した場合にファイルが上書きされないようにします。

おすすめ記事