Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
BLOGTIMES
2013/05/17

bash でタブ区切りテキストを処理する

  sh 
このエントリーをはてなブックマークに追加

以前に「変数展開で簡単なcsvを処理する」というのを書いたので、これと同じ方法でも TSV の処理ができるのですが、今日は違う方法で TSV 処理する方法を見つけたのでメモ。

bash では変数で配列を扱うことができるのは、これも以前やった「パイプでつないだコマンドの終了ステータスをとる」で明らかになっていますが、配列のデリミタは IFS という変数を使って変更することができます。つまり、 IFS にタブを入れておけば TSV のデータ1つ1つを配列に読み込むことができます。

例えば下記のような感じ。

tsv.sh

#!/bin/bash i=0 cat 'data.txt' | while read LINE ; do IFS="$(echo -e '\t' )" LINE=($LINE) unset IFS for j in `seq 0 $(( ${#LINE[@]} - 1))`; do echo "$i,$j: ${LINE[$j]}" done i=$(($i+1)) done

これに下記のような TSV を読み込ませます。

data.txt

a1 a2 a3 b1 b2 b3 c1 c2 c3

ちょっと for がトリッキーですが、こんな感じで1カラムずつ処理できているのが分かると思います。

$ bash tsv.sh 0,0: a1 0,1: a2 0,2: a3 1,0: b1 1,1: b2 1,2: b3 2,0: c1 2,1: c2 2,2: c3

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5807
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン