Just another Ruby porter,


3月下旬の日記 | RDF

2015-03-28 (Sat)

04. 元素記号

sedだと行番号を指定できるので比較的簡単。

% echo "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." |
  xargs -n1 |
  sed '2,4b;10,14b;17,18b;s/^\(.\).*/\1/;:;s/^\(..\).*/\1/'                              
H
He
Li
Be
B
C
N
O
F
Ne
Na
Mi
Al
Si
P
S
Cl
Ar
K
C

確かにマグネシウムMgがMiになってるのはだめなんじゃないかな。

% echo "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." |
  xargs -n1 |
  sed '2,4b;12s/\(.\)./\1/;10,14b;17,18b;s/^\(.\).*/\1/;:;s/^\(..\).*/\1/'
H
He
Li
Be
B
C
N
O
F
Ne
Na
Mg
Al
Si
P
S
Cl
Ar
K
C

ちょっとアドホックすぎるが。


2015-03-27 (Fri)

03. 円周率

記号がいやらしい。

% echo Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics. |
  awk '{printf length}' RS='[,. \n]+';echo
314159265358979
% echo Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics. |
  xargs -n1 sh -c 'echo -n $1 | tr -d ,. | wc -c' - | paste -sd ''
314159265358979

xargsの-Iオプション

先の例は

  xargs -n1 -I{} sh -c 'echo -n {} | tr -d ,. | wc -c' | paste -sd ''

でいいような気がするんだが、{}はNow I ... mechanicsのように全部展開されてしまう。

% echo Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics. |
  xargs -n1 -I{} echo {}                                        
Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.

-d ' 'とすれば一応分割される。しかし今度は改行がそのまま{}に入ってしまう。

% echo Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics. |
  xargs -n1 -d ' ' -I{} echo {}
Now
I
need
a
drink,
alcoholic
of
course,
after
the
heavy
lectures
involving
quantum
mechanics.

いずれにしても難しい。というか素直にfor i in ...でいいんだが。

% sh -c 'IFS=" ,."; for i in Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.; do echo -n $i | wc -c; done' | paste -sd ''
314159265358979

2015-03-26 (Thu)

パトカー+タクシー #シェル芸

昨日の逆。やはりgrepとpasteで。

% echo パトカー|grep -o .
パ
ト
カ
ー
% echo タクシー|grep -o .
タ
ク
シ
ー
% paste -d "" <(echo パトカー|grep -o .) <(echo タクシー|grep -o .)
パタ
トク
カシ
ーー
% paste -d "" <(echo パトカー|grep -o .) <(echo タクシー|grep -o .) | paste -sd ""
パタトクカシーー

3つでも可能。

% paste -d "" <(echo りんご|grep -o .) <(echo みかん|grep -o .) <(echo ばなな|grep -o .) | paste -sd ""
りみばんかなごんな

2015-03-25 (Wed)

パタトクカシーーってなんだ #シェル芸

ひとつとびにならべてみるとわかります。

% echo パタトクカシーー | grep -o ..               
パタ
トク
カシ
ーー
% echo パタトクカシーー | grep -o .. | grep -o '^.'
パ
ト
カ
ー
% echo パタトクカシーー | grep -o .. | grep -o '^.' | paste -sd "" 
パトカー

で、もう1個のほうは

% echo パタトクカシーー | grep -o .. | grep -o '.$' | paste -sd ""
タクシー

まあ、sedのほうが簡単。

% echo パタトクカシーー | sed 's/\(.\)./\1/g'                     
パトカー
% echo パタトクカシーー | sed 's/.\(.\)/\1/g'
タクシー

cf: 言語処理100本ノック 2015


2015-03-24 (Tue)

プロセス置換を待つ

hoge > >(foo)とかやるとhoge | fooと同じようなことができるが、foo自体の終了は待たない。
あまり問題にはならないけど、待ちたいときもある。
zshだと

% { hoge; } > >(foo)

で待つようになるらしい。MULTIOSの機能だとか。

% date > >(sleep 1; cat)
% Tue Mar 24 23:13:28 JST 2015

% { date; } > >(sleep 1; cat)
Tue Mar 24 23:13:34 JST 2015
% 

終了を待たないのでプロンプトが先に表示されていたが、
ちゃんと待つようになっている。


3月下旬の日記 | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!