【宿題】「第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