bashで行列データベースの特定行を読み出し一度に複数の変数を定義する方法
1. 目的
n行m列のテキストデータベースがあったとします。それから指定の行の要素を読み出して、複数の変数に格納します。面倒なので配列は使いたくありません。
2. 環境
- CentOS 7.
- bash 4.2
3. 考え方
指定行をsed
で読み出してそれをread
渡して変数に設定する。
4. テスト用のデータベース
- 第1列は重なりのない1刻みの数字だとします。データの列の並びは
NUM MAKER MODEL TYPE
とします。例えば、
$ cat data.txt
1 apple iPhone AAA
2 google Android BBB
3 sony Walkman CCC
5. コード
$ cat test.bash
#!/usr/bin/bash
read NUM MAKER MODEL TYPE <<< $(sed -n "${1}p" $2)
echo "$MAKER" "$TYPE" "$NUM" "$MODEL"
- 説明:
-
read
は変数を複数設定できます。そのread
に文字列を渡します。
- 実行したコマンド結果を
<<< $()
で文字列として取り出します
-
sed
は-n
で非表示にして、数字p
で指定行だけ表示します。
-
sed
に表示行数とファイルを$1
と$2
で渡します。
- 最後の
echo
で変数がグローバル変数であることを確認しています。順番も変えて確かめています。
6.結果
$ ./test.bash 1 data.txt
apple AAA 1 iPhone
$ ./test.bash 2 data.txt
google BBB 2 Android
$ ./test.bash 3 data.txt
sony CCC 3 Walkman
$
- 大丈夫なようです。普通に考えると
-
MAKER=$(awk '$1 == 1{print $2}' data.txt)
みたいなコード書きがちですが、変数が多いと長くなりがちです。
- データベースとして情報を行列にして、レコードをユニークなシリアル数字で管理するという基本形を採用すると
bash
でもシンプルにコードが書けます。アルゴリズムよりデータ構造が大切ですね。データベースの登録時に重なりがないことのチェックとか、情報の削除はレコードは残しフィールドだけvoid
にするとか、それなりに気を使う必要がありますが、読み出すのは楽です。
- こんな短いコードでデータベースを扱えるので
bash
好きです。ちょっとしたアイディアですが、どなたかのお役に立てると嬉しいです。
NUM MAKER MODEL TYPE
とします。例えば、$ cat data.txt
1 apple iPhone AAA
2 google Android BBB
3 sony Walkman CCC
$ cat test.bash
#!/usr/bin/bash
read NUM MAKER MODEL TYPE <<< $(sed -n "${1}p" $2)
echo "$MAKER" "$TYPE" "$NUM" "$MODEL"
- 説明:
-
read
は変数を複数設定できます。そのread
に文字列を渡します。 - 実行したコマンド結果を
<<< $()
で文字列として取り出します -
sed
は-n
で非表示にして、数字p
で指定行だけ表示します。 -
sed
に表示行数とファイルを$1
と$2
で渡します。 - 最後の
echo
で変数がグローバル変数であることを確認しています。順番も変えて確かめています。
-
6.結果
$ ./test.bash 1 data.txt
apple AAA 1 iPhone
$ ./test.bash 2 data.txt
google BBB 2 Android
$ ./test.bash 3 data.txt
sony CCC 3 Walkman
$
- 大丈夫なようです。普通に考えると
-
MAKER=$(awk '$1 == 1{print $2}' data.txt)
みたいなコード書きがちですが、変数が多いと長くなりがちです。
- データベースとして情報を行列にして、レコードをユニークなシリアル数字で管理するという基本形を採用すると
bash
でもシンプルにコードが書けます。アルゴリズムよりデータ構造が大切ですね。データベースの登録時に重なりがないことのチェックとか、情報の削除はレコードは残しフィールドだけvoid
にするとか、それなりに気を使う必要がありますが、読み出すのは楽です。
- こんな短いコードでデータベースを扱えるので
bash
好きです。ちょっとしたアイディアですが、どなたかのお役に立てると嬉しいです。
$ ./test.bash 1 data.txt
apple AAA 1 iPhone
$ ./test.bash 2 data.txt
google BBB 2 Android
$ ./test.bash 3 data.txt
sony CCC 3 Walkman
$
-
MAKER=$(awk '$1 == 1{print $2}' data.txt)
みたいなコード書きがちですが、変数が多いと長くなりがちです。
bash
でもシンプルにコードが書けます。アルゴリズムよりデータ構造が大切ですね。データベースの登録時に重なりがないことのチェックとか、情報の削除はレコードは残しフィールドだけvoid
にするとか、それなりに気を使う必要がありますが、読み出すのは楽です。bash
好きです。ちょっとしたアイディアですが、どなたかのお役に立てると嬉しいです。Author And Source
この問題について(bashで行列データベースの特定行を読み出し一度に複数の変数を定義する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/Woodie/items/c3461688758d2697ce94著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .