shell IFS(Field Separator)でハマった
下のようねTABがセパレータのデータ(text-with-tab)に対して
次のようなbash readのスクリプトを掛けてみる
#!/bin/sh cat text-with-tab | ( IFS='\t' while read line1 line2 line3 line4 do echo $line1/$line2/$line3/$line4 done )
真ん中にに見えるwhite spaceみたいのはTABね。
atbtct dtetft atbtct dtetft
結果は
a/b/c/ d e f a/b/c/ d e f
あらら、tの文字がセパレータになってしまい、
これではうまくいかないのね。
つぎの組み合わせを確認してみた。
一番おしりから2番目のやつがうまくいかないのは、まぁそうゆうもんかと。
bashにとっては、$ S 某 S の組み合わせで初めて意味があるってことね
シングルクォートをSと表す。
ダブルクォートをWと表す。
1) IFS='\t' ... S \ t S の順番入力 ダメ
2) IFS=' ' ... S (tabkey) Sの順番に OK
3) IFS=' ' ... S Ctrl-v Ctrl-i Sの順番で入力OK
4) IFS=$'\t' ...$ S \ t Sの順番で入力OK
5) IFS=$' ' ... $ S (tablkey) Sの順番 OK
1) IFS="\t" ... W \ t W の順番入力 ダメ
2) IFS=" " ... W (tabkey) Wの順番 OK
3) IFS=" " ... W Ctrl-v Ctrl-i Wの順番で入力 OK
4) IFS=$"\t" ...$ W \ t Wの順番で入力 ダメ
5) IFS=$" "... $ W (tabkey) Wの順番 OK
って感じ。
ちなみにbashの場合、IFSはあるが、FSとかOFSの指定オプションはない。
出力される区切り文字はスペースのみらしい。
さらにちなみに
awkの場合は
FS(入力セパレータ)、OFS(出力のセパレータ)になる。
IFSはない。おぼえられないよぉ
BEGIN{FS="\t" ; OFS="\t"}{print $1 $2}とすると$1と$2がくっついて
TABは現れない。
OFSのTABを有効にしたい場合は
BEGIN{FS="\t" ; OFS="\t"}{print $1,$2}がただしい。
けっこうはまりました orz