mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Linux - bash でテキストファイルから行抽出(配列操作)!

[ サーバ構築 ] [ Linux, Unix, bash, シェル ]

こんばんは。

Linux(Unix 含む) のシェル(bash) での配列操作についてです。

そんなに使用する頻度はありませんが、どうしても使用したくなる局面があるので記録として残しておきます。

作業メモ

0. 前提条件

  • Cygwin 1.7.15 での作業を想定していますが、Linux, BSD でも同様です。
  • 使用するシェルは bash です。
  • 以下の例は、固定長テキストファイルから指定位置の文字列を配列に格納する処理です。

1. テキストファイルの準備

今回のテストでは以下のようなテキストファイルを使用する。 (固定長のテキストファイルです)

【ファイル名: test.txt】

1
2
3
4
5
6
7
8
9
10
[0001]  A-1002    100        459 [13]            ( 1 )
[0001]  B-1004      1     96,600 [13]            ( 1 )
[0001]  A-1034    100        486 [13]            ( 1 )
[0001]  B-1054      1     28,870 [13]      [15]  ( 2 )
[0001]  C-1085    100      1,758 [13] [14]       ( 2 )
[0001]  B-1093      1    106,000      [14]       ( 1 )
[0001]  B-1094      1    247,000 [13]            ( 1 )
[0001]  A-1090    100      3,675 [13] [14] [15]  ( 3 )
[0001]  C-1094    100      1,507      [14]       ( 1 )
[0001]  B-1066    100         66 [13]            ( 1 )

2. bash スクリプトの作成

上記のテキストファイルを1行ずつ読み込み、9文字目から14文字目までを取得し配列に格納する例です。

【ファイル名:test.sh】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

# テキストファイル定義
FILE_NAME=test.txt

# IFS は文字列リストのフィールド区切り文字で、デフォルトは半角スペース。
# 行をそのまま取り込むために IFS を改行に変更
OLDIFS="$IFS"
IFS="\n"

# 配列定義
ARY_CODE=()

# テキストファイルを1行ずつ読み込む
while read LINE
do
    # 1行分の文字列の先頭から9~14文字目を取得
    # CODE=`echo $LINE | cut -c9-14`  # <= これでもよいが少し処理が遅い。
    CODE="${LINE:8:6}"

    # 配列に追加
    ARY_CODE=("${ARY_CODE[@]}" "$CODE")
done < $FILE_NAME

# 配列の内容を出力して確認
for (( I = 0; I < ${#ARY_CODE[@]}; ++I ))
do
    echo ${ARY_CODE[$I]}
done

# IFS を元に戻す
IFS="$OLDIFS"

【補足】

  • 配列への追加は、インデックスを指定してセットする方法や、要素を列記する方法もあります。
  • 配列の要素数は ${#配列名[@]} で取得できます。

3. bash スクリプトの実行

以下のようにして bash スクリプトを実行する。 今回は分かりやすくする為、使用するテキストファイルと bash スクリプトは同じディレクトリに配置している。

1
2
3
4
5
6
7
8
9
10
11
$ ./test.sh
A-1002
B-1004
A-1034
B-1054
C-1085
B-1093
B-1094
A-1090
C-1094
B-1066

当方、Linux サーバではよくシェルスクリプトを使用していますが、単純なものが多いです。 シェルでも意外と複雑なこともできるので、応用範囲が広がると思います。

以上。

Comments