【宿題】「第54回シェル芸勉強会」の解答例


Q1

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

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

A1

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

Q2

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

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

A2

$ cat <(awk 'NR%2{printf $1}NR%2==0{print $1}' kouun.txt | grep) <(awk 'NR%2==0{printf $1}NR%2{print $1}' kouun.txt | grep) | sed 's/[↑↓]//g' | sort | uniq
うんこ
運行
耕運
沈降

Q3

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

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

A3

$ grep -o . human.txt | uniname -p | grep Character | awk '{print $7,$8}' | sed 's/.//' | awk '{if($1%2){f+=1}else{m+=1}}END{print "♂: "m,"\n♀: "f}'
♂: 11
♀: 7

Q4

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

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

A4

$ grep -o . yoko.txt | uniname -p | grep HIRAGANA | awk '{print $NF}' | sed 's/.$//;s/^$/-/' | sort | uniq -c | sed 'y/-KSTNHMYRW/あかさたなはまやらわ/' | awk '{print $2,$1}' | sort
あ 4
か 6
さ 2
た 1
な 1
は 2
ま 2
や 3
ら 1

Q5

# 問題に使うファイルをダウンロード
wget 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

小問1

さきほどのURL先にあるファイルから、同じ記号が最も長く続いている部分が何行目にあるか、探してください。行をまたいでいるデータをつなぎあわせて探す必要はありません。

小問2

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

A5

小問1

$ grep -n $(grep -Po 'A+|T+|G+|C+' Figure1Figure2_032321.fasta | awk '{print length($1),$1}' | sort -r | head -n1 | awk '{print $2}') Figure1Figure2_032321.fasta
106:GGCCTCCCCCCAGCCCCTCCTCCCCTTCCTGCACCCGTACCCCCGTGGTCTTTGAATAAAGTCTGAGTGGGCGGCAAAAA

小問2

$ cat -n Figure1Figure2_032321.fasta | tr -d ' \t\r\n' | grep -Po '(A\d*)+|(T\d*)+|(G\d*)+|(C\d*)+' | awk '{c=gsub(/[ATGC]/,"&");print c,$0}' | sort -k1,1nr | head -n1 | sed -E 's/^[0-9]+ //;s/[0-9]+$//;s/[^0-9]/ /g;s/[0-9]+/cat -n Figure1Figure2_032321.fasta | grep -B1 &/e'
   106  GGCCTCCCCCCAGCCCCTCCTCCCCTTCCTGCACCCGTACCCCCGTGGTCTTTGAATAAAGTCTGAGTGGGCGGCAAAAA
   107  AAAA

Q6

次のjugem.txtから、

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

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

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

A6

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

Q7

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

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

A7

$ awk '{split($1,a,"");l=length(a);for(i=1;i<=l;i++)m[NR,i]=a[i]}function row(r,s,e, i){if(s<e){for(i=s;i<=e;i++)printf m[r,i]}else{for(i=s;i>=e;i--)printf m[r,i]}}function col(c,s,e, i){if(s<e){for(i=s;i<=e;i++)printf m[i,c]}else{for(i=s;i>=e;i--)printf m[i,c]}}END{for(i=0;i<4;i++){row(1+2*i,1+2*(i-1),l-2*i);if(i>2)break;col(l-2*i,2+2*i,NR-1-2*i);row(NR-2*i,l-2*i,1+2*i);col(1+2*i,NR-1-2*i,4+2*i)}printf "\n"}' nejineji.txt
寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶらこうじのぶらこうじパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピー
Written on June 27, 2021