💭

✍️ 1行目を除いて5行ごとに保存する小ワザ

に公開

テキストファイルを扱っていて、1行目にヘッダーがあるケースってよくありますよね。
ヘッダー行はそのまま残しておきたいけど、データ部分は5行おきに抜き出したい…そんなときに使えるワンライナーをご紹介します。


使うコマンド

# ヘッダーを除いてから、5行ごとに1行だけ抽出するパターン
tail -n +2 input.txt | awk 'NR%5==1' > output.txt
  • tail -n +2 input.txt

    • ファイルの2行目以降を全部表示します。
    • 1行目(ヘッダー)をスルーするイメージ。
  • awk 'NR%5==1'

    • パイプで流れてきた2行目以降のデータを、行番号 (NR) を5で割った余りが1の行だけ出力します。
    • 具体的には、元ファイルの2行目→パイプ後の1行目、7行目→パイプ後の6行目…といった感じで5行おきにキャッチ。
  • > output.txt

    • 抜き出した結果を output.txt にまとめて保存します。

どういうときに役立つ?

  • 大きめのログファイルをダイジェスト表示したいとき
  • CSVデータのサンプリング抽出
  • バッチ処理前に動作検証用のテストデータを手早く作りたいとき

本格的にスクリプトを書かなくても、シェルだけでサクッとデータ整形できるのがイイところ。Unix系コマンドの組み合わせで、ちょっとしたお掃除やサンプリングが楽になるので、ぜひ覚えておいてください!

Tip: 5 の部分を変えれば、3行ごと、10行ごと…と自由自在にサンプリングできます。ぜひいろいろ試してみてくださいね。

Discussion