Bashシェルスクリプトでファイルや標準入力の先頭N行、末尾N行を除去する方法

2021-03-22Bash

はじめに

シェルスクリプトで標準入力で受け取った情報の先頭N行、末尾N行を削る方法について紹介します。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 5.0.3(1)-release (x86_64-apple-darwin18.2.0)

$ head --version | head -n 1
head (GNU coreutils) 8.22

$ tail --version | head -n 1
tail (GNU coreutils) 8.22

標準入力として渡すデータ

seq コマンドを使って、 1〜10 の数値を渡して、先頭の 2行 と 末尾の 2行 を削ってみます。

$ seq 1 10
1       << ※ここを削除
2       << ※ここを削除
3
4
5
6
7
8
9       << ※ここを削除
10     << ※ここを削除

head , tail を使う

head はファイルや標準入力の先頭から何行を出力(デフォルトでは10行)というように使うケースが多いですが、 「ファイル末尾から数えて何行目より前をすべて出力」 という場合にも利用できます。-n - という変わったオプションを利用します。

# 末尾から2行目より前をすべて出力
$ seq 1 10 | head -n -2
1
2
3
4
5
6
7
8

tail コマンドにも同じように、 「ファイル先頭から数えて何行目以降をすべて出力」 というオプションがあります。
-n + というオプションを指定します。

head の場合は -n -2 ですが、 tail の場合は -n +2 ではなく -n +3 であることに注意が必要です。「より前」なのか「以降」なのかがややこしいですね。

$ seq 1 10 | tail -n +3
3
4
5
6
7
8
9
10

あとはheadtail を組み合わせればOKです。

$ seq 1 10 | head -n -2 | tail -n +3
3
4
5
6
7
8

ひとこと

CSVのヘッダー行を取り除く場合や、末尾の集計行を取り除く場合に便利でよく使います。

e-statのようなサイトで公開されているCSVには、データ以外の説明などが含まれていたりします。

headtail の使い方を知っていると非常に便利です。

2021-03-22Bash