シェル芸160本ノック解答例 その5

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題41

$ sed -E 's/\[/\n&/g' annotation.md | grep -P '^\[\^.+?]' | sed -E 's/(]:?).*/\1/;s/]$/&m/' | sort | rev | uniq -cs1 | rev | awk '$2%2{print ($1~/m$/?"目印":"注釈文"),$1}' | sed 's/.$//'
目印 [^abort_f]
目印 [^about_b]
注釈文 [^about_d]
注釈文 [^about_f]

問題42

$ pandoc -t gfm item.md | sed -E 's/^([0-9]+\.) +/\1 /'
# AAA

1. AAAはすごいな
2. AAAはたのしいな
3. AAAはきれいだな

# BBB

1. BBBはすごいな
2. BBBはたのしいな
3. BBBはきれいだな
4. BBBはゆかいだな
5. BBBは・・・

問題43

$ sed '/^\[/s/$/$/;s/^$/$/' bunken.txt | tr -d '\n' | sed 's/\$\[/$\n[/g' | sort | tr '$' '\n'
[1] 日々之迷歩
https://papiro.hatenablog.jp/

[2] くんすとの備忘録
https://kunst1080.hatenablog.com/

[3] シェル芸 | 上田ブログ
https://b.ueda.tech/?page=01434

[4] トップページ | gihyo.jp, 技術評論社
https://gihyo.jp/

[5] 俺的備忘録
https://orebibou.com/

問題44

$ sed -Ez 's/(シ\n?ェ\n?ル\n?ス\n?ク\n?リ\n?プ\n?ト)/!\1!/g' diary.txt | sed '/!/s/$/ @/;s/!//g'
今日もシェルスクリプトを書いた。その @
後、ストロング系のチューハイを3本飲
み、少し休憩した後に人の書いたシェル @
スクリプトを手直しした。体内にアル @
コールがまわり、意識が朦朧とする中、
シェルスクリプトかわいいよシェルスク @
リプトという謎ワードが前頭葉をぐるぐ @
るして止まらなくなったので、もうだめ
だと思って寝た。

問題45

$ sed 's/ /_/g' sh_highschool | cat -n | sort -k2,2 | uniq -Df1 | sort -k1,1n | tr '\t' : | rs 2 | rs -T | sed '/:$/s/.*//;s/:/ /g' | awk '{if(!$0){n+=10000;print n};if($0){printf "%d %d %s\n%d %d %s\n",n+$1,$1,$2,n+1000+$3,$3,$4;print n+100,"*"}}' | sort -u | awk '{if(!$2)printf "\n";if(!$3)printf " -";if($3)printf " %d",$2}' | sed 's/^ - //;$s/$/\n/;/^$/d'
3 4 5 - 12 13 14
8 9 - 17 18

問題46

$ mecab const26.txt | sed 's/[\t,]/ /g' | perl -C -aE '$F[0]=~s/(\p{Han}+)/\1($F[8])/ if $F[0]!~/\p{P}/&&$F[0]=~/\p{Han}/;say $F[0]' | nkf --hiragana | perl -C -lnE 's/(.+)\)\1$/)$1/;say' | tr -d '\n' | sed 's/EOS/\n/'
憲法(けんぽう)第(だい)26条(じょう)1項(こう):すべて国民(こくみん)は、法律(ほうりつ)の定(さだ)めるところにより、その能力(のうりょく)に応(おう)じて、ひとしく教育(きょういく)を受(う)ける権利(けんり)を有(ゆう)する。

問題47

# 小数点以下は4桁で表示
$ awk -F, 'BEGIN{p=1}{printf("%s,%d,",$1,$2);printf(NR==1?"*\n":"%+.4f%%\n",($2/p)*100-100);p=$2}' mom.csv
2017/01,108192,*
2017/02,134747,+24.5443%
2017/03,120420,-10.6325%
2017/04,147368,+22.3783%
2017/05,262456,+78.0957%
2017/06,280741,+6.9669%
2017/07,315083,+12.2326%
2017/08,522489,+65.8258%
2017/09,489003,-6.4089%
2017/10,729017,+49.0823%
2017/11,987173,+35.4115%
2017/12,1025320,+3.8643%

問題48

$ ps aux | awk 'NR>1{c[$1]+=$3;p[$1]+=1}END{for(n in c)print c[n],p[n],n}' | sort -k1,1nr -k2,2nr
27.4 56 mitsuhi+
0.7 89 root
0 2 avahi
0 1 Debian-+
0 1 clamav
0 1 colord
0 1 message+
0 1 ntp
0 1 rtkit

なお、集計結果は実行環境により異なります。


問題49

# `perl`の特殊変数`$,`は、`awk`の組み込み変数`OFS`に相当
$ perl -aE 'if($F[0]=~/^\d+/){$,="&";say "$F[8] $F[11]",@F[12..$#F]}' top.log | awk '{c[$2]+=$1}END{for(n in c)print n,c[n]}' | sort -k2,2nr | sed -E '1s/[0-9]+.[0-9]+$/(&)/;s/&/ /g;q'
/root/test/load_ueda 3 600000 100000 (35114.5)

問題50

$ join -1 1 -2 3 <(sed 's/ /-/' stones_master) <(sed 's/ /-/3' sales | sort -k3,3) | awk '{i[$2]=$1;s[$2]+=$3*$6}END{for(n in s)print i[n],n,s[n]}' | sort | cut -d' ' -f2-
シェル石 1500
非行石(青) 10000
非行石(偽物・赤) 70
おじいちゃんから出た石 31
デーモンコア 200000
Written on October 23, 2022