bash 스크립트는 첫 번째 인수를 입력으로 읽고 다른 파일에서 한 줄씩 변수를 찾습니다.

bash 스크립트는 첫 번째 인수를 입력으로 읽고 다른 파일에서 한 줄씩 변수를 찾습니다.

변수 A1, A2, A3, θ, θ1 및 θ2를 포함하는 "input.txt" 파일이 있습니다. input.txt의 예는 다음과 같습니다.

$ cat input1.txt 

A1=5.2 A2=4.9  A3=6.1 θ=space    θ1=2.5 θ2=1.2 

A1=3.1 A2=5.1  A3=3.7 θ=triangle θ1=8.1 θ2=3.9

input.txt 파일을 실행할 스크립트를 만들고 싶습니다. 파일은 두 번째 매개변수로 전달되고 첫 번째 매개변수는 theta 값이 됩니다.

아래와 같이 스크립트를 만들었습니다.

#! /bin/bash

file=input1.txt

if grep -q $1 "$file"; 
then
awk -F '[= ]+' '{ print $12 }' <$2

else

echo "Not available"
fi
}

하지만 이 스크립트를 다음과 같이 실행하면:

./script space input.txt   

(첫 번째 매개변수는 θ의 값이고 두 번째 매개변수는 파일 이름입니다.) 출력은 필드 12의 모든 값입니다.

$ ./script1 space input1.txt 
1.2
3.9

출력은 1.2여야 합니다. 검색한 결과 파일을 한 줄씩 읽으려면 루프를 만들어야 하는데 작동하지 않는다는 것을 알았습니다.

답변1

다음 주소에서 모든 작업을 완료할 수 있습니다 awk.

#!/bin/sh
file=$2

awk -v theta="$1" -F '[= ]+' '
        $0 ~ theta { print $12; found++ }
        END        { if (!found) { print "Not available"; exit 1 } }' "$file"

$2두 명령줄 인수가 모두 존재하고 읽을 수 있는 파일 이름인지 확인하려면 오류 처리를 추가해야 할 수도 있습니다.

  • 파일을 읽을 수 없으면 $2오류 메시지가 나타납니다.awk
  • 비어 있거나 $2없으면 awk표준 입력을 자동으로 읽습니다.

(물론, 이러한 행동 중 하나 또는 둘 모두에 문제가 없을 수도 있습니다.)

노트:

  • $0 ~ theta로 변경하면 보다 정확한 결과를 얻을 수 있습니다 $8 == theta.
  • 의 변수는 awk공백으로 초기화됩니다. 이는 수학적 맥락에서 0으로 처리되므로 found++첫 번째 실행 시 1로 설정됩니다. found의도적으로 이렇게 말하는 것입니다. found++대신 found = 1여러 행이 일치하면 theta 값이 found다음으로 설정됩니다.숫자그런 라인. 이는 오류 조건인 것처럼 보입니다. 우려되는 경우 END1이 아닌 경우 오류를 보고하도록 블록을 수정할 수 있습니다.found
  • 물론 값을 찾았을 때 한 가지 작업을 수행하고 값을 찾을 수 없을 때 다른 작업을 수행하는 스크립트가 필요한 경우 블록 print에서 해당 명령문을 제거하고 스크립트가 종료 상태를 테스트하고 자체 오류 메시지를 내보내 도록 할 수 있습니다. . 출력(예: theta2 값)을 캡처하려는 경우에도 동일한 작업을 수행해야 합니다 . 반대로, 사람이 읽을 수 있는 오류 메시지만 필요하고 종료 상태를 확인할 필요가 없다면 블록에서 명령문을 제거 할 수 있습니다 .ENDawkawkexitEND

답변2

이 시도:

#! /bin/bash

file=input1.txt

if grep -q $1 "$file";
then
        grep $1 $2 | awk -F '[= ]+' '{ print $12 }'
else
        echo "Not available"
fi

답변3

귀하의 논리는 다음과 같이 요약됩니다.

grep -om1 "$1" < "$2" ||
echo 'Not available.'

grep...어쨌든 GNU가 제공됩니다. 하지만 저라면 포기하거나 echo, 적어도…

! echo 'Not available.' >&2

...대신에.

관련 정보