Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題119

問題119 メモリマップの表示

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

要は与えられたファイルを系統だてて出力するという問題になっているのだが、ファイルの出力の時点で詰まってしまった。ディレクトリにまたがるファイルの出力をどうすればいいかさっぱりだった。解答ではブレース展開を使っていたがこれが使えないほど数が多い場合はどうするのだろうか。グロブだと順番が変わってちょっとめんどくさそうだ。pasteで出力をまとめるのも数が多くなるとこのままではうまくいかなさそうだ。ちょっと考えただけではわからない。

解答例は

cat /sys/firmware/memmap/{0..8}/{start,end,type} | paste - - - | awk -F'\t' '{printf "%016x-%016x %s\n",strtonum($1),strtonum($2)+1,$3}'

となる。まずブレース展開でファイルをすべて出力する。そのあとpasteで3行ずつまとめて出力しなおす。そのあとawkで数値の整形を行い出力をする。strtonumは文字列を読み取り自動で8進数か16進数かなどを解釈し、10進数で値を返す関数だ。最終的な出力は16進数が欲しいのでそうなるように変換指定子xをつけている。%016は16桁で、0埋めをするという意味だ。

8.4.25 printfコマンド(書式の引数を書式に従って変換し,標準出力に出力する) : JP1/Advanced Shell