hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

シェル・ワンライナー160本ノック week1 練習1.3.a~練習1.3.e

はじめに

 私はプログラムはPythonしか書けず,CLIでのコマンド操作もcdやlsのような超基本的なコマンドしか使ってこなかったため,コマンドが使えなくて困ったという場面に出くわしたことはありませんが,なんとなく今まで引け目を感じていました.そんなときにこの本を見つけ,この機会にUnix系OSのシェル操作を習得しようと決意しました.
 半年以内に習得とあるのでweek26位で完結できるように毎週7問程度取り組んでいこうと思います.最初の方はそれほど難しくないためそれ以上の問題数解くかも知れません.
 環境はWindowsのWSLで解いていきます.

練習1.3.a

sedによる置換

 sedコマンドで文字列を置換することが出来ます.

$ echo あいうえお | sed 's/あ/ア/'
アいうえお

 引数の一番目のsが文字の置換を行う宣言?で/a/bで文字列のaをbに置換出来ます.

&による再利用

$ echo あいうえお | sed 's/あい/&&&/'
あいあいあいうえお

 &で検索対象の文字を再利用できます.今回は&があいとなるので,&&&はあいあいあいとなります.

\による後方参照

$ echo あいうえお | sed -E 's/(あ)(い)(う)/\3\2\1/'
ういあえお

 文字列を()で囲む事で順番に番号が与えられます.それを\1\2と呼び出すことが出来ます.1-indexのようです.この()はあくまで文字に順番を与えるという役割しか与えてないっぽいため,

$ echo あいうえお | sed -E 's/(あ)(う)(お)/\3\2\1/'
あいうえお

この出力は おいうえあ にはならずに あいうえお となります.あ が番号1,う が番号2,おが番号3として置換を行うわけではなく,あうお という文字列を探して置換しているためです.あいうえお には あうお という文字列は存在しないため,出力はそのままあいうえおとなります.

1.3.c

grepによる検索

 1.3.cの別解2にsedより原始的な置換コマンドtrを使っていましたが,sedで書くとこうなります.

$ echo 中村 山田 田代 上田 | sed "s/ /\n/g" | grep "田$"
山田
上田

1.3.d

awk

 awkを使う事で文字列を数字として検索出来ます.だいぶ詰まったのですが,awkでは引数はシングルクォーテーションでしか動かないようです.今まではダブルクォーテーションでも動いてたので詰まりました.

$ seq 5 | awk "$1%2==0"
awk: コマンドライン:1: %2==0
awk: コマンドライン:1: ^ syntax error

$ seq 5 | awk '$1%2==0'
2
4

1.3.e

sort

 三項演算子によって 条件?条件が真の時:偽の時 という記述が出来ます.これを使って偶数ならgusuに奇数ならkisuに文字を置き換えます.

$ seq 5|awk '{print $1%2 ? "kisu":"gusu"}'
kisu
gusu
kisu
gusu
kisu

これをsortによってソートします.

$ seq 5|awk '{print $1%2 ? "kisu":"gusu"}'| sort
gusu
gusu
kisu
kisu
kisu

uniq

 uniqでユニークな要素,つまり重複を取り除いて出力します.

$ seq 5|awk '{print$1%2 ? "kisu":"gusu"}'| sort|uniq
gusu
kisu

更にオプションとして-cを付けるとその要素数を出力します.

$ seq 5|awk '{print$1%2 ? "kisu":"gusu"}'| sort|uniq -c
2 gusu
3 kisu