1. ホーム
  2. バッシュ

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

2022-03-23 14:58:02

質問

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

今現在、私は sed -i -e "1d" $FILE - が、削除を行うのに1分ほどかかってしまいます。

もっと効率的に実現する方法はないでしょうか?

どのように解決するのですか?

試す テール :

tail -n +2 "$FILE"

-n x : ただ、最後の x の行を削除します。 tail -n 5 を実行すると、入力の最後の5行が表示されます。その + 記号は、引数を反転させて tail は、最初の x-1 の行になります。 tail -n +1 はファイル全体を表示します。 tail -n +2 最初の行を除くすべて、など。

GNU tail よりもはるかに高速です。 sed . tail はBSDでも利用可能で -n +2 フラグは、両方のツールで一貫しています。また フリーBSD または OS X をご覧ください。

BSDバージョンは sed とはいえ。どうやって管理してるんでしょうね。 tail はファイルを一行ずつ読み込むだけでよいのに対して sed は、スクリプトの解釈や正規表現の適用など、かなり複雑な処理を行う。

注意: あなたは

# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"

が、これでは 空ファイル . その理由は、リダイレクト( > の前に発生します。 tail がシェルによって呼び出されます。

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

ファイル内の1行目を削除したい場合は、以下のようにします。

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

&& は、問題があったときにファイルが上書きされないようにするためのものです。