BASHがtxtファイルを読み取り、配列に格納する

私は最初のBASHスクリプトを書いていますが、cとc#の経験があるので、プログラムは正しいです..それは、同じものを書く方法が何十億もあるので、構文がとても複雑なだけです!

とにかくここにスクリプトがあります:それは単に引数(文字列)が特定のファイルに含まれています。その場合、ファイルの各行を配列に格納し、配列の項目をファイルに書き込みます。これを実現するためのもっと簡単な方法があるはずですが、bashループを使って練習したいと思います

 #!/bin/bash NOME=$1 c=0 #IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY #ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1] if grep "$NOME" /root/phonebook.txt ; then echo "CREATING ARRAY" while read line do myArray[$c]=$line # store line c=$(expr $c + 1) # increase counter by 1 done < /root/phonebook.txt else echo "Name not found" fi c=0 for i in myArray; do if myArray[$i]="$NOME" ; then echo ${myArray[i+1]} >> /root/numbertocall.txt fi done 

このコードは、2番目の項目のみを返しますmyArrayの(myArray[2]またはファイルの2行目)..なぜですか?

コメント

  • \ tにはどのような関連性がありますか?テキストとコードの残りの部分はどちらも行を参照しているだけです。
  • 直接的な答えではないため、'は単なるコメントですが、'これは1つのライナーgrepで行います; grep -P -o "(?<=$NOME\t).+"
  • @Patrick Classic XY問題なので、コメントは答えになるはずです。結局のところ、それは正しいことです。

回答

IFS=$"\n" a=($(cat phonebook.txt)) for i in $(seq ${#a[*]}); do [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}" done 

Bash4ではIFS=$"\n" a=($(cat phonebook.txt))

grep -A1は、一致後に1行を出力します。-xは-Fのような正規表現を無効にしますが、完全なlにのみ一致します。 ines。

grep -x "$name" -A1 phonebook.txt | tail -n1 

コメント

  • 検証する可能性があります最初にファイルの内容。あなた次第です。
  • -x正規表現を無効にしません
  • そのままにしておきますは、展開でsplit + globを呼び出します。ここでは、 split 部分が必要ですが、 glob 部分は必要ないため、無効にする必要があります(set -o noglob)。
  • grep -xFe "$name" -A1 phonebook.txtまたはgrep -xFA1 -- "$name" phonebook.txtである必要があります。そうでない場合、'は機能しません。 $name-で始まる場合、または$POSIXLY_CORRECTが環境内にある場合は適切です。
  • bashでは、'は[[ $string = $pattern ]]または。またはIOWの場合、iv id = “をしない場合は、[[...]]内の=演算子の右側で単語展開を引用する必要があります。 1030d3bf88 “>

パターンとして解釈されたくない。

回答

index=0 while read line; do myArray[index]="$line" done < inputfile 

新しいバージョンのbashは、連想配列をサポートしています。

declare -A myArray while read name; do read number myArray[name]="$number" done < inputfile echo ${myArray[name]} 

コメント

  • そしてmyArrayのアイテムをどのように返すか[name + 1]?
  • インデックス付きの例では、すでにソリューションが用意されているため、'コピーしませんでした。
  • 間違っていますが、そのようなパイプを使用しても、myArray "がループの外側に見えなくなります" ???
  • @FredericYesidPe ñ aS á nchez質問にも回答にもパイプラインが含まれていないため、'何について話しているのかわからない。
  • "名前を読んでいる間; "は私にはパイプライン、とにかく、"宣言-aarray "が以前に発生した問題を修正していることがわかりました。ありがとう!!! +1

回答

BASHでtxtファイルを読み取って配列に保存する」というタイトルの質問で/ em> “readarrayは言及に値すると思います。テストファイルを配列に読み込むために使用するこの方法の例は次のとおりです。

readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt 

上記は、IPアドレスのファイルを改行で区切って次のように読み込みます。 「 arrayIPblacklist 」という配列。電話帳ファイルで動作します。 readarrayはbash4で導入されたため、このメソッドは以前のbashバージョンを実行している古いホストでは機能しません。

-tオプションは、ほとんどの場合、改行区切り文字を含めたくないため、各要素から改行区切り文字を削除します。

$ seq 3 | bash -c "readarray a; printf "<%q>\n" "${a[@]}"" <$"1\n"> <$"2\n"> <$"3\n"> $ seq 3 | bash -c "readarray -t a; printf "<%q>\n" "${a[@]}"" <1> <2> <3> 

コメント

  • 受け入れられた回答はすでにmapfileに言及していることに注意してください。これは、readarray組み込み。
  • 私の悪い-'それはわかりませんでした。ありがとう@St é faneChazelas!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Deep Theme Powered by WordPress