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

Mon Nov 9 09:51:28 JST 2020 (modified: Mon Nov 9 10:33:26 JST 2020)
views: 495, keywords: プログラミング,勉強会,シェル芸,シェル芸勉強会

  このエントリーをはてなブックマークに追加 
  • 問題で使われているデータファイルはGitHubにあります。クローンは以下のようにお願いします。
  • 環境: 解答例は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回シェル芸勉強会リンク集





このサイトではGoogle Analyticsやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies, please disable cookies on your browser.