【問題】jus共催 第50回記念我々は50回も何をやってるんだろうシェル芸勉強会
Mon Nov 9 09:51:28 JST 2020 (modified: Mon Nov 9 10:33:26 JST 2020)
views: 1550, keywords:プログラミング,勉強会,シェル芸,シェル芸勉強会 この記事は最終更新日が4年以上前のものです。
- 問題で使われているデータファイルはGitHubにあります。クローンは以下のようにお願いします。
git clone https://github.com/ryuichiueda/ShellGeiData.git $
- 環境: 解答例はUbuntu Linux 20.04で作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。
Q1
un.txt.gz
から、UNITY, UNKO, unity, unko
の数をそれぞれなるべく短時間で数えてください。 単語の途中に改行が入っているものも数えてください。
Q2
un.txt.gz
でa
のみが書いてある行の行数をなるべく早くカウントしてください。
Q3
un.txt.gz
を展開しておきます。
$ zcat un.txt.gz > a
次のようにcat
して出力を捨てると一瞬で終わりますが、システムをワンライナーでいじって、このcat
にかかる時間を遅くしてみてください。
### 普通にcatするとすぐ終わる ###
$ time cat a > /dev/null
real 0m0.124s
user 0m0.000s
sys 0m0.124s
### なにか細工をする ###
$ ワンライナー
$ time cat a > /dev/null
real 0m1.810s ←遅くなる
user 0m0.000s
sys 0m0.413s
Q4
1から1億までの数字をシャッフルして2列にしたデータ(ファイル名はa
にしましょう)を作ってください。速いワンライナーを考えてください。例を示します。
$ head -n 5 a
30704298 56976301
61041738 68147433
99052527 91351967
63294008 15458140
3840917 37301114
Q5
このワンライナーを、出力の内容は変えずに高速になるように改良してください。
$ time cat a | sort -k2,2n > b
real 0m59.258s
user 0m54.078s
sys 0m3.841s
Q6
a
について、両方の数字が素数の行を抽出してファイルに保存してください。
Q7
a
について、次の操作をしてください。
- 上の行からA, B, C, D, E, ..., Z, A, B, C, ...と記号をつける。
A 4796421 46315959
B 37830772 88906806
C 81382245 28729184
D 32681244 48378429
E 66092656 22445817
・・・
- 記号を与えられた数字を1行にまとめて
ans
というファイルに保存する。
$ awk '{print $1,$2,$3, "...", $(NF-1),$NF}' ans | head -n 3
A 4796421 46315959 ... 90741157 92659988
B 37830772 88906806 ... 70859873 22640999
C 81382245 28729184 ... 98481095 67292404
Q8
Q7について、さらに各行の数字を小さい順にソートするという条件をつけてください。ans2
というファイルに保存します。
$ awk '{print $1,$2,$3, "...", $(NF-1),$NF}' ans2 | head -n 3
A 21 41 ... 99999966 99999973
B 5 29 ... 99999946 99999958
C 11 105 ... 99999970 99999994