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