다양한 크기의 문자열을 비교하는 데 도움이 필요합니다.

다양한 크기의 문자열을 비교하는 데 도움이 필요합니다.

밧줄이 두 개 있는데 크기가 다릅니다.

지역 도시 가져오기각 시민이 살고 있는 도시의 이름을 반환합니다.

지역 간호사를 구하세요CS가 앞에 오는 각 간호사가 근무하는 도시 이름을 반환합니다.

GetLocalCit=$(awk -F "[:]" '{print $4}' citizens.txt)
GetLocalNurse=$(awk -F "[:]" '{print $3}' nurses.txt)

산출지역 도시 가져오기예:

Lisboa
Santarem
Porto
Porto
Lisboa
Braga
Braganca
Setubal
Setubal
Porto
Leiria
Santarem
Porto
Lisboa

산출지역 간호사를 구하세요예:

CSLisboa
CSPorto
CSSantarem
CSSetubal
CSLeiria
CSBraga
CSBraganca
CSBeja
CSEvora
CSFaro
 CSCoina 
 CSMarvao 
CSTrasOM
CSTrs
CSAA
CSAB
CSAC
CSAD
CSAE
CSAF

내가하고 싶은 것은 각각을 비교하는 것입니다다른도시 이름의 유래는지역 도시 가져오기각 도시 이름과 함께지역 간호사를 구하세요일치하는 항목을 찾으면(즉, 도시 이름이 이미지역 간호사를 구하세요), 그런 다음 "이 도시에 간호사가 있습니다."라고 반향합니다.

나는 이것을 온라인에서 찾아보고 이것의 변형을 구현하려고 시도했습니다.

#!/bin/bash

STR='GNU/Linux is an operating system'
SUB='Linux'
if [[ "$STR" == *"$SUB"* ]]; then
  echo "It's there."
fi

내 코드에서는 '\n'으로 구분된 두 문자열에 여러 단어가 있기 때문에 작동하지 않을 수 있습니다...

저도 만들어볼까 생각도 해봤는데하지만반복하지만 문자열을 사용하여 올바르게 구현하는 방법을 모릅니다!

답변1

grep내 생각에는 당신이 사용하는 것이 더 낫다고 생각합니다지역 도시 가져오기검색 문자열 목록:

 grep -f GetLocalCit GetLocalNurse

또는 파일이 아닌 명령인 경우

 grep -f <(GetLocalCit)  <(GetLocalNurse)

다음을 반환합니다.

CSLisboa
CSPorto
CSSantarem
CSSetubal
CSLeiria
CSBraga
CSBraganca
 

그런 다음 sed를 통해 이 목록을 사용할 수 있습니다.

grep -f GetLocalCit GetLocalNurse | sed 's/CS/There is already a nurse in /' 

마침내 얻었습니다 :

There is already a nurse in Lisboa
There is already a nurse in Porto
There is already a nurse in Santarem
There is already a nurse in Setubal
There is already a nurse in Leiria
There is already a nurse in Braga
There is already a nurse in Braganca

이것이 어떻게 도시의 중복을 제거하는지 주목하세요지역 도시 가져오기


이제 원본 코드 예제를 살펴보세요.

다음 두 목록을 반복해야 합니다. 여기에 파일이 있다고 가정합니다.

for city in $(cat GetLocalCit) ; do
  for nurse in $(cat GetLocalNurse) ; do
    if [[ $nurse =~ $city ]] ; then
       echo "Nurse found in $city."
    fi
  done
done

중첩 루프를 사용하는 것은 그리 효율적이지 않을 수 있습니다 bash.

Nurse found in Lisboa.
Nurse found in Santarem.
Nurse found in Porto.
Nurse found in Porto.
Nurse found in Lisboa.
Nurse found in Braga.
Nurse found in Braga.
Nurse found in Braganca.
Nurse found in Setubal.
Nurse found in Setubal.
Nurse found in Porto.
Nurse found in Leiria.
Nurse found in Santarem.
Nurse found in Porto.
Nurse found in Lisboa.

모든 중복을 유지하십시오.

답변2

comm -12 <(GetLocalCit | sort -u) <(GetLocalNurse | cut -c3- | sort -u) |
    sed -E 's/^/There is a nurse in /'

There is a nurse in Braga
There is a nurse in Braganca
There is a nurse in Leiria
There is a nurse in Lisboa
There is a nurse in Porto
There is a nurse in Santarem
There is a nurse in Setubal

comm이는 정렬된 파일 쌍에서 공통 행을 식별하는 데 사용됩니다.

관련 정보