質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

3回答

1519閲覧

空白行を区切りに文字列をそれぞれシェルスクリプトで配列に格納したい

usansa

総合スコア2

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

2クリップ

投稿2021/07/09 06:43

編集2021/07/10 03:53

テキストシェルスクリプトで以下のような空白行区切りの文字列を配列に格納したいのですが、どうすればよいでしょうか。
<test.txt>
~~~~~~~~
red 1 2
blue 2 3

dog 2 3 4
cat 2 9

a 1 2
i 3 4 5
~~~~~~~~

実行したいことは以下のようにArray配列に入れたいです。
Array[0]=
red 1 2
blue 2 3

Array[1]=
dog 2 3 4
cat 2 9

Array[2]=
a 1 2
i 3 4 5

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showkit

2021/07/09 07:17

ん~と 見た目、「a 1 2」の行と「i 3 4 5」の間に空白がはいっていて、「i 3 4 5」の文字が大きくなっちゃっているのですが、そういうことは ないのですね?
otn

2021/07/09 13:12

質問文がぐちゃぐちゃなので、意味が取りにくいです。 ちゃんと書けますか? ちゃんと書くのが無理そうならそう書いてください。 もしくは、どういう処理をしたいのかを文章で書いてください。
usansa

2021/07/10 03:53

申し訳ありません、修正しました。ご教示いただけますと幸いです。
guest

回答3

0

シェルの知識が深いわけではありませんが、ちょっと考えてみました。
以下のコードでいかがでしょうか?
見当違いの回答でしたら、スルーしてください。

bash

1#!/bin/bash 2cat test.txt | awk ' 3 BEGIN{ 4 RS="" 5 FS="\n" 6 i=0 7 } 8 { 9 Array[i]=$0 10 i++ 11 } 12 END{ 13 for(i=0; i<length(Array); i++) { 14 printf "%s\n", Array[i] 15 } 16 } 17'

投稿2021/08/11 22:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一時的に別の配列に代入する方法はどうでしょうか?

bash

1declare -a Array Str 2declare Str 3 4while read -r line; do 5 if [[ "${line}" = "" ]]; then 6 Array+=("${Str[*]}") 7 Str=() 8 else 9 Str+=("${line}") 10 fi 11done < ./text 12printf "%s\n" "${Array[@]}"

投稿2021/08/03 16:24

Hayao819

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あまりシェルレベルでやることでは無いような気がします。

Bash

1Array=() 2B= 3while read line 4do if [ "$line" ] 5 then B+="$line 6" 7 else Array+=("$B") 8 B= 9 fi 10done < test.txt 11Array+=("$B")

シェルで処理せず、AwkでRS=""にしてAwk内で処理するのが普通でしょうか。

投稿2021/07/10 15:07

編集2021/08/11 23:18
otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問