파일을 반복하고 각 단어를 변수로 만드시겠습니까?

파일을 반복하고 각 단어를 변수로 만드시겠습니까?

다음과 같은 텍스트 파일이 있습니다.

1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad

1923.12.312. variable1이 파일을 반복한 다음 make 를 하고 Nikl variable2echo 명령에서 사용하려고 합니다 . 그런 다음 계속 진행하여 이러한 등을 만들고 에코 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"의 세 가지 필드가 고려됩니다.

관련 정보