이 코드에 어떤 문제가 있나요? [폐쇄]

이 코드에 어떤 문제가 있나요? [폐쇄]

코드는 다음과 같습니다.

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]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명령줄에서 해당 구분 기호를 제거하면 됩니다. 여전히 작동하지만 입력 파일이 유닉스 텍스트 파일(예: 줄 바꿈만 사용)이 아닌 MS-DOS/Windows 텍스트 파일(예: 캐리지 리턴 및 줄 바꿈을 줄 종결자로 사용)인 경우 다음과 같이 끝납니다. 캐리지 리턴 문자를 출력합니다. 파이프되지 않으면 캐리지 리턴 문자가 표시되지 않습니다.-F'[[:space:]]+'awkcat -v

 Energy: -1090.28213580 Ry^M

이 경우 먼저 파일을 Unix 형식으로 변환하십시오 fromdos.

답변2

문제의 일부는 배열을 en잘못 인덱싱하고 있다는 것입니다. 배열을 인덱싱할 때는 중괄호를 사용해야 합니다
.

   $en[$lst]
하지만
   ${zh[$lst]}

관련 정보