한 목록에 다른 목록에 포함된 문자열이 포함되어 있는지 확인

한 목록에 다른 목록에 포함된 문자열이 포함되어 있는지 확인

예를 들어 file1.txt와 같은 문자열 목록이 있습니다.

a
B
ccc
    D
   E
 f

그리고 또 다른 문자열 목록인 file2.txt:

    a x y z
  43 5 B aa_f
    <|ccc
 |D>
    E
                            FFF

file2.txt의 각 줄에 file1.txt의 해당 줄에 포함된 잘린 문자열이 포함되어 있는지 확인하고 싶습니다(따라서 주위에 공백이 없음). 예를 들어 두 파일의 라인 2에는 가 포함되어 있으므로 B이 테스트는 로 평가되어야 합니다 true. 그러나 두 파일의 마지막 줄은 f해당 줄의 문자가 file1.txt에 포함되어 있고 file2.txt에 포함되어 있지 않기 때문에 하위 문자열 관계가 아닙니다 f.

답변1

문자열에 공백이 없다고 가정하면 file1.txt다음 awk기반 접근 방식이 작동합니다.

awk 'NR==FNR{patterns[FNR]=$1} FNR<NR{if (index($0,patterns[FNR])>0) print "true"; else print "false"}' file1.txt file2.txt

귀하의 예를 들어 이것은 생성됩니다

true
true
true
true
true
false

몇 가지 설명: 우리는 awk두 파일을 모두 읽었지만 다르게 처리했습니다.

  • 전역 라인 카운터 와 동일하게 file1.txt로 표시되는 FNR"파일별 라인 카운터"를 처리할 때 모든(잘라낸) 문자열을 -internal( 라인의 공백으로 구분된 첫 번째 필드) 배열에 등록합니다. 줄 번호로(1부터 시작한다는 점에 유의하세요)NR$1awk

  • file2.txt( FNR이제 보다 작음 )을 처리할 때 NR이 함수를 사용하여 입력 라인 전체에서 문자열을 찾습니다( ) index. 그렇다면 0보다 큰 시작 위치가 반환되어 인쇄되고, 그렇지 않으면 인쇄됩니다.patterns[FNR]$0index()truefalse

답변2

awk 'ARGIND == 1 { a[NR]=$1;     next }
     $0 ~ a[FNR] { print "true"; next }
                 { print "false"      }' ex1 ex2

Awk에서는 "cond {action}" 구조로 프로그램을 작성하는 것을 선호합니다. 이는 @AdminBee 솔루션과 매우 유사합니다.

  • ARGIND ==1- 첫 번째 인수인 경우: 첫 번째 단어를 저장합니다.
  • $0 ~ a[FNR]- 행( $0)에 저장된 동족이 포함되어 있으면 "true"이고, 그렇지 않으면 "false"입니다.

관련 정보