head, tail vs. sed


0. Contents

1.Concept
2.Test Script
3.Run Test
4.Summary


1. Concept

ファイルから一行ずつ抜き出して処理を行う際には head と tail を
組み合わせるのが一般的だと思うが sed でも似たような事ができる。
先頭の一行のみを抜き出す場合も含めて処理速度を比較してみた。


2. Test Script

100行の行番号だけが書かれたファイルを用意して
比較の為のスクリプトを作成した。
ソースは以下の通り。

Script1
#! /usr/bin/env bash
seq 1 100 > test.txt

test1(){
  for (( i=1; i <= 100; i++ )) ; do
    a=$( head -n "$i" test.txt | tail -n 1 )
  done
}

test2(){
  for (( i=1; i <= 100; i++ )) ; do
    a=$( sed -n "$i p" test.txt )
  done
}

test3(){
  for (( i=1; i <= 100; i++ )) ; do
    a=$( head -n 1 test.txt )
  done
}

time test1
time test2
time test3
exit

Script2
#! /usr/bin/env bash
seq 1 100 > test.txt

a=$( head -n 12 test.txt | tail -n 5 )
b=$( sed -n '8,12 p' test.txt )
c=$( head -n 102 test.txt | tail -n 5 )
d=$( sed -n '98,102 p' test.txt )

echo -e "a\n$a\n"
echo -e "b\n$b\n"
echo -e "c\n$c\n"
echo -e "d\n$d\n"
exit


3. Run Test

上記のスクリプトの実行結果。

Script1
test1: head -n "$i" test.txt | tail -n 1
real    0m2.499s
user    0m1.840s
sys     0m0.620s

test2: sed -n "$i p" test.txt
real    0m0.312s
user    0m0.140s
sys     0m0.170s

test3: head -n 1 test.txt
real    0m1.209s
user    0m0.920s
sys     0m0.280s

Script2
a
8
9
10
11
12

b
8
9
10
11
12

c
96
97
98
99
100

d
98
99
100


4. Summary

一行だけ抜き出す場合でも sed の方がはるかに速いが
sed は正確に行数を数えるので head、tail で書かれた
N 行目から M 行目を抜き出すスクリプトを単純に置き換えると
挙動が変わる可能性があるので注意。