
"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
...대신에.