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

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

"input.txt" 파일에는 변수 A1, A2, A3, θ, θ1 및 θ2가 있습니다. 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 파일을 실행하는 스크립트를 만들고 싶습니다. 이 파일은 두 번째 인수로 전달되며 첫 번째 인수는 θ 값이 됩니다.

다음과 같이 스크립트를 만들었습니다.

#! /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으로 처리되므로 처음 실행될 때 1로 found++설정됩니다 . found일부러 그렇게 하는 found++대신 found = 1여러 줄이 세타 값과 일치하면, found 하면숫자그런 라인 중. 이는 오류 조건인 것 같습니다. 걱정되는 경우 1이 아닌 END경우 오류를 보고하도록 블록을 수정할 수 있습니다.found
  • 물론 값이 발견되면 한 가지 작업을 수행하고 값이 발견되지 않으면 다른 작업을 수행하기 위해 스크립트가 필요한 경우 블록 print에서 명령문 을 삭제 END하고 스크립트가 awk의 종료 상태를 테스트하고 자체 오류 메시지를 발행하도록 할 수 있습니다. . awk(즉, θ2 값) 의 출력을 캡처하려는 경우에도 이 작업을 수행해야 합니다 . 반대로, 사람이 읽을 수 있는 오류 메시지만 필요하고 종료 상태를 확인할 필요가 없다면 블록 exit에서 명령문 을 삭제할 수 있습니다 END.

답변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

...대신에.

관련 정보