다음과 같은 텍스트 파일이 있습니다.
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
1923.12.312.
variable1
이 파일을 반복한 다음 make 를 하고 Nikl
variable2
echo 명령에서 사용하려고 합니다 . 그런 다음 계속 진행하여 이러한 등을 만들고 에코 12391.123.123
variable1
해야 합니다.Jo
variable2
이것이 내가 지금까지 한 일입니다:
while read p
do
variable1="$(awk '{print $1}')"
variable2="$(awk '{print $2}')"
echo "if [ \"\$STATUS\" == \"$variable1\" ]
then
vem=\"$variable2\"
fi"
done saker.txt
다음과 같이 출력되어야 합니다.
if [ "$STATUS" == "1923.12.312." ]
then
vem="NIKL"
fi
잠깐만요. 하지만 그렇지 않습니다. 대신에 이것이 출력입니다.
awk: cmd. line:1: {print $2)
awk: cmd. line:1: ^ syntax error
if [ "STATUS" == "12391.123.123
12398123.123912" ]
then
vem=""
fi
또한 변수를 삭제하고 다음을 수행해 보았습니다.
while read p
do
echo "if [ \"\$STATUS\" == \"`awk '{print $1}'`\" ]
then
vem=\"`awk '{print $2}'`\"
fi"
done saker.txt
그러나 그것은 동일한 결과를 가져왔습니다.
답변1
쉘을 사용하다
행을 변수로 분할하는 읽기 기능을 사용하면 쉽습니다.
while read var1 var2
do
echo "if [ \"\$status\" == \"$var1\" ]
then
vem=\"$var2\"
fi"
done <saker.txt
그러면 다음이 생성됩니다.
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
awk를 사용하세요:
이 awk 명령은 단일 printf
명령을 사용합니다.
$ awk '{printf "if [ \"$status\" == \"%s\" ]\nthen\nvem=\"%s\"\nfi\n",$1,$2}' saker.txt
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
답변2
나는 스크립트를 전혀 업데이트하기 위해 스크립트를 실행해서는 안된다고 강력히 생각합니다. 대신 awk
원본 스크립트에서 호출하여 그런 방식으로 필요한 데이터를 가져와야 합니다. 그런 다음 이 saker.txt
파일을 스크립트 작성 스크립트의 출력을 변경하는 데 사용하는 대신 스크립트의 동작을 변경하기 위한 구성 파일(즉)로 사용할 수 있습니다.
saker.txt
분명히 귀하의 스크립트에는 매우 제한된 데이터가 있지만 조회 테이블을 사용하여 스크립트에 변수를 설정하고 있는 것 같습니다 .
특히 스크립트 조각은 다음과 같습니다.
if [ "$STATUS" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$STATUS" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$STATUS" == "12398123.123912" ]
then
vem="Ad"
fi
기능 복제는 다음과 같이 인라인 awk 스크립트를 사용하여 수행할 수 있습니다.
vem=$( awk -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
bash
이는 " 파일에서 다른 변수의 값을 찾는 것을 기반으로 변수를 어떻게 설정합니까?"라는 질문에 대한 답변입니다. 이는 스크립트를 업데이트하기 위해 스크립트를 실행하여 수행하려는 작업인 것 같습니다.
물론 " $STATUS
의 값이 전혀 나열되지 않으면 어떻게 되나요?", saker.txt
"두 번 나열되면 어떻게 되나요?", "기본값은 어떻게 설정하나요 vem
?" 등의 주의사항도 있습니다. 이러한 모든 문제와 스크립트 업데이트 스크립트가 있습니다.
vem
편집: 파일에 지정된 값에 공백을 허용하려면 saker.txt
탭과 같은 다른 것을 구분 기호로 사용하는 것이 좋습니다.
$ cat saker.txt
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
그런 다음 다음 버전의 awk
단일 라이너를 사용하십시오.
vem=$( awk -Ft -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
탭 구분 기호에 대한 경고: 사용하지 마세요.하나 이상상표. 기본 "공백으로 구분된" 처리와는 awk
달리각탭 문자는 사이에 텍스트가 있는지 여부에 관계없이 구분 기호로 처리됩니다. 따라서 10000<tab><tab>John
"10000", ""(빈 필드) 및 "John"의 세 가지 필드가 고려됩니다.