【問題】jus共催 第50回記念我々は50回も何をやってるんだろうシェル芸勉強会

Mon Nov 9 09:51:28 JST 2020 (modified: Mon Nov 9 10:33:26 JST 2020)
views: 1233, keywords:プログラミング,勉強会,シェル芸,シェル芸勉強会 この記事は最終更新日が3年以上前のものです。

  • 問題で使われているデータファイルは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.gzaのみが書いてある行の行数をなるべく早くカウントしてください。

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
ノート   このエントリーをはてなブックマークに追加 
 

prev:【問題と解答】jus共催 第50回記念我々は50回も何をやってるんだろうシェル芸勉強会 next:jus共催 第50回シェル芸勉強会リンク集

やり散らかし一覧

記事いろいろ