Twitterで以下のようなやり取りを見かけて、cutコマンドなどはよく知らなかったので勉強になりました。
ファイルからN行ランダムに取り出したいという要求に sort -R filename | head -n N ってのを思いついたけど,順番は保持しなきゃいけないので使えなかった.残念.スクリプト書くしかないか.
@conditional cat -n filename | sort -R | head -n N | sort -nk1 | cut -c8- とかでどうでしょう?と書いてたらもう解決したみたいね…
2013-03-22 14:54:46 via web to @conditional
他にもっと簡単なやり方がないかなーと思って調べてみました。
sortコマンドの問題
"sort -R filename"は行のハッシュ値を元にソートしているため、まったく同じ行があった場合には連続してしまうみたいです。
たとえば以下のようなファイルをソートした時
0 0 1 1 2 2
以下のように同じ行はまとまって出力されます
1 1 2 2 0 0
shufコマンド
大抵の用途ではまったく同じ行も含めてランダムな順番になってほしいと思うので、そういう時はshufコマンドを使うとよいみたいです
"shuf filename"を使うと以下のようにまったく同じ行もバラバラに出力されます。
0 0 1 2 1 2
また"-n N"で出力する行数の指定もできるみたいです。
これを使うと冒頭で紹介した例のコマンドは以下のように短くできます。
cat -n filename | shuf -n N | sort -nk1 | cut -c8-
まとめ
cutコマンドなどの文字列操作系のコマンドをほとんど利用してないので、もっと勉強しようと思いました。