【問題と解答】jus共催 第54回生ぬるいシェル芸勉強会

Sat Jun 26 22:38:11 JST 2021 (modified: Sat Jun 26 22:38:11 JST 2021)
views: 1701, keywords:プログラミング,勉強会,シェル芸,シェル芸勉強会 この記事は最終更新日が3年以上前のものです。

  • 問題で使われているデータファイルはGitHubにあります。クローンは以下のようにお願いします。
$ git clone https://github.com/ryuichiueda/ShellGeiData.git
  • 環境: 解答例はUbuntu 20.04 LTSで作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。

Q1

つぎのoraora.txtから、「おらおら」など、ある2文字が2回繰り返される単語が2個ある行を、行番号とともに抽出してください。3個以上ある行は抽出しないでください。

$ cat oraora.txt
   おらおらほいへいおらおらへいおらへい
   へいへいおらへいおらへいへいおらおら
   ぺいぺいぽいぺいぽいぺいぽいぺいぽい
   ぺぺいぺいぽいぽいおらほらぺぺいぽい
   ぺいぺいぽいぽいおらおらおらおらおら

解答例

$ cat oraora.txt | grep -Pn '(..)\1.*(..)\2' | grep -Pv '(..)\1.*(..)\2.*(..)\3'
   1:おらおらほいへいおらおらへいおらへい
   4:ぺぺいぺいぽいぽいおらほらぺぺいぽい

Q2

つぎのkouun.txtから、矢印が向いている単語だけを抽出してください。順番は変わっても構いません。

$ cat kouun.txt
   耕運
   ↑
   幸運
   ↓
   運行
   ↑
   運賃
   ↓
   沈降
   ↓
   うんこ
   ↑
   ウコン

解答例

$ cat kouun.txt | pee 'grep -A1 ↓ ' 'grep -B1 ↑' | grep -v '[-↓↑]' | sort -u
   うんこ
   運行
   耕運
   沈降
   $ cat kouun.txt | xargs | awk '{for(i=1;i<=NF;i++)if($(i+1)=="↑" || $(i-1)=="↓")print $i}'
   耕運
   運行
   沈降
   うんこ
   $ cat kouun.txt | grep -zPo -e  '(.*\n↑|↓\n.*)' | sed 's/[↑↓]//g' | tr -d \\0 | awk NF
   耕運
   運行
   沈降
   うんこ

Q3

human.txtについて、男性を表すアイコン、女性を表すアイコンの数をそれぞれ数えてください。

$ cat human.txt
   👩‍👩‍👧‍👦👨‍👨‍👧‍👦👨‍👩‍👧👨‍👩‍👦‍👦👨‍👨‍👦

解答例

$ cat human.txt | uniname 2> /dev/null | grep ' 01' |
   awk '{print substr($3,6)}' | awk '$1%2{print "female"}!($1%2){print "male"}' | sort | uniq -c
         7 female
        11 male

Q4

あ行、か行、さ行・・・わ行の文字の数をそれぞれ求めてください。0個の行は出力する必要はありません。

$ cat yoko.txt
   よこはまよこすかかみおおおかほりのうちこやす

解答例

$ cat yoko.txt | uniname 2> /dev/null | awk 'NF==10{print substr($10,1,1)}' |
   tr IUEO AAAA | sort | uniq -c | sed 'y/AKSTNHMYRW/あかさたなはまやらわ/' | sort -k2,2
         4 あ
         6 か
         2 さ
         1 た
         1 な
         2 は
         2 ま
         3 や
         1 ら

Q5

小問1

https://github.com/NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273/blob/main/Figure1Figure2_032321.fasta にあるファイルから、同じ記号が最も長く続いている部分が何行目にあるか、探してください。行をまたいでいるデータをつなぎあわせて探す必要はありません。

ただし、行をまたいでいる可能性も考慮してください。そして、最後にAが続いている部分は無視してください。

ファイルは、次のようにダウンロードしましょう。ファイルは、

$ curl https://raw.githubusercontent.com/NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273/main/Figure1Figure2_032321.fasta > a

と保存してから解答をしましょう。

小問2

データが行をまたいでいることも考慮して、同じ記号が最も長く続いている部分が何行目(〜何行目)か、探してください。

解答例

小問1

$ nkf -wLux a | grep -Eo '(.)\1+' | awk '{print length,$0}' | sort -n |
   sed -n '$s/.* //p' | xargs -I@ grep -n @ <(nkf -wLux a)
   106:GGCCTCCCCCCAGCCCCTCCTCCCCTTCCTGCACCCGTACCCCCGTGGTCTTTGAATAAAGTCTGAGTGGGCGGCAAAAA

小問2

$ nkf -wLux a | tr -d \\n | grep -Eo '(.)\1+' | awk '{print length,$0}' |
   sort -n | sed -n '$s/.* //p' | sed 's/./&\\\\n?[0-9]*:?/g' | sed 's/^/\[0-9\]*:.*/'  |
   xargs -I@ grep -zPo @ <(nkf -wLux a | grep -n '') | sed '$d'
   106:GGCCTCCCCCCAGCCCCTCCTCCCCTTCCTGCACCCGTACCCCCGTGGTCTTTGAATAAAGTCTGAGTGGGCGGCAAAAA
   107:AAAA

Q6

次のjugem.txtから、

$ cat jugem.txt
   寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶらこうじのぶらこうじパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助

次のような出力を得てください。

寿水行ころパイーリンポ
   限の末とやポポグンポコ
   無魚雲むぶイののダのナ
   寿水来住らパシンイーの
   限利末にこポュガグピ長
   無砂風ろうイーンーコ久
   五海来こじパリリリポ命
   劫れ末とのじンーンンの
   のき食るぶうガュダポ長
   すりう寝らこンシイの助

解答例

$ cat jugem.txt | grep -oE '.{10}' | sed -n '1~2p;2~2s/.*/echo & |
   rev/ep' | sed 's/./& /g' | rs -T | tr -d ' '
   寿水行ころパイーリンポ
   限の末とやポポグンポコ
   無魚雲むぶイののダのナ
   寿水来住らパシンイーの
   限利末にこポュガグピ長
   無砂風ろうイーンーコ久
   五海来こじパリリリポ命
   劫れ末とのじンーンンの
   のき食るぶうガュダポ長
   すりう寝らこンシイの助

Q7

次のnejineji.txtの文を1行にしてください。

$ cat nejineji.txt
   寿限無寿限無五劫のすりきれ
               海
   じのぶらこうじパイポパ 砂
   う         イ 利
   こ グーリンダイグ ポ 水
   ら の     ー パ 魚
   ぶ ン コピー リ イ の
   や ガ ポ   ン ポ 水
   ろ ン ンポのイダ の 行
   こ リ       シ 末
   と ーュシンガンリーュ 雲
   む           来
   住にろことる寝う食末来風末

解答例

AWKの再帰を使います。

$ cat nejineji.txt | sed '1i               ' |
   sed '$a              ' | sed 's/^/ /;s/$/ /' |
   awk -F '' 'function f(x,y){if(a[x][y]!=" "){printf a[x][y];a[x][y]=" ";
   f(x-1,y);f(x+1,y);f(x,y-1);f(x,y+1)}}
   {for(i=1;i<=NF;i++)a[i][NR]=$i}END{f(2,2)}' | awk 4
   寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶらこうじのぶらこうじパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピー
ノート   このエントリーをはてなブックマークに追加 
 

prev:日記(2021年6月3日) next:jus共催 第54回シェル芸勉強会リンク集

やり散らかし一覧

記事いろいろ