변수 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
다음으로 설정됩니다.숫자그런 라인. 이는 오류 조건인 것처럼 보입니다. 우려되는 경우END
1이 아닌 경우 오류를 보고하도록 블록을 수정할 수 있습니다.found
- 물론 값을 찾았을 때 한 가지 작업을 수행하고 값을 찾을 수 없을 때 다른 작업을 수행하는 스크립트가 필요한 경우 블록
print
에서 해당 명령문을 제거하고 스크립트가 종료 상태를 테스트하고 자체 오류 메시지를 내보내 도록 할 수 있습니다. . 출력(예: theta2 값)을 캡처하려는 경우에도 동일한 작업을 수행해야 합니다 . 반대로, 사람이 읽을 수 있는 오류 메시지만 필요하고 종료 상태를 확인할 필요가 없다면 블록에서 명령문을 제거 할 수 있습니다 .END
awk
awk
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
...대신에.