Bashシェルスクリプトでファイルや標準入力の先頭N行、末尾N行を除去する方法
はじめに
シェルスクリプトで標準入力で受け取った情報の先頭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
あとはhead
と tail
を組み合わせればOKです。
$ seq 1 10 | head -n -2 | tail -n +3
3
4
5
6
7
8
ひとこと
CSVのヘッダー行を取り除く場合や、末尾の集計行を取り除く場合に便利でよく使います。
e-statのようなサイトで公開されているCSVには、データ以外の説明などが含まれていたりします。
head
、 tail
の使い方を知っていると非常に便利です。
ディスカッション
コメント一覧
まだ、コメントがありません