このコードにはどのような問題がありますか? [閉鎖]

このコードにはどのような問題がありますか? [閉鎖]

コードは次のとおりです。

cm=$1
nm=$2
case $cm in
"out")
declare -a  en
declare -a inf
ec=$(grep -n "! " hw1_out_si_wire.txt)
IFS=$'\n' en=($ec)
lst=$((${#en[@]} -1))
IFS=' ' inf=($en[$lst])
echo " Energy: ${inf[4]} ${inf[5]}"
;;
"in") echo "It's not my problem";;
esac

$enの7番目の要素を取得しようとしていますが、結果は次のようになります。

[7]ergy: -1090.13343774 Ry

$en 配列は ;

!    total energy              = -1090.13343774 Ry
!    total energy              = -1090.20757070 Ry
!    total energy              = -1090.24296462 Ry
!    total energy              = -1090.25563488 Ry
!    total energy              = -1090.27085564 Ry
!    total energy              = -1090.27693129 Ry
!    total energy              = -1090.28213580 Ry
!    total energy              = -1090.29131927 Ry

もしそうなら、このコードにどのような問題がありますか?出力はなぜこのようになりますか?

注:提供された情報が十分でない場合はお知らせください。

答え1

実は何か可能あなたがそれをやってもbashそれをしなければならないか、良い考えであることを意味するわけではありません。あなたがしたいawkことはperl

Bash配列はbashをかなり高度な方法で使用するものであり、bash / sh言語自体の制限(および使用の不便さ)のために他の言語の配列ほど有用ではありません。複数の引数をコマンドや関数に渡すのに適していますが、それ以外は使用が制限されます。

bash配列を使用する代わりにawk

たとえば、

#! /bin/sh

cm="$1"
nm="$2"

case "$cm" in
  out) awk -F'[[:space:]]+' '
           /^!/  {
             c++;
             if (c==7) {
               print " Energy:",$5,$6;
             };
           };' hw1_out_si_wire.txt ;;

   in) echo "It's not my problem" ;;
esac

出力:

 Energy: -1090.28213580 Ry

含まれているawkスクリプトはaで始まる各行の数を数え!、7行に達すると5番目と6番目のフィールドを印刷します。

この-Fオプションは、フィールド区切り文字を1つ以上の空白文字(スペース、タブ、改行、キャリッジリターン、フォームフィード、垂直タブ)に設定します。私のコメントに使用されたバージョン[\r[:blank:]]+(スペース文字、スペース、タブ、キャリッジリターン)。入力データについても同様に動作します。

awkバージョンが正規表現フィールド区切り文字をサポートしていない場合(たとえば)、コマンドラインmawkからその区切り文字を削除します。それでも動作しますが、入力ファイルがUnixテキストファイル(改行のみを使用する)ではなくMS-DOS / Windowsテキストファイル(キャリッジリターンと改行を行終端として使用)の場合は、次のようになります。キャリッジリターン文字を出力します。パイプしないと、キャリッジリターン文字は表示されません。-F'[[:space:]]+'awkcat -v

 Energy: -1090.28213580 Ry^M

その場合は、まずファイルをUnix形式に変換してくださいfromdos

答え2

問題の一部は、配列にen誤ってインデックスを付けていることです。配列にインデックスを付けるときは、中かっこを使用する必要があります

   $en[$lst]
しかし、
   ${zh[$lst]}

関連情報