![한 목록에 다른 목록에 포함된 문자열이 포함되어 있는지 확인](https://linux55.com/image/13609/%ED%95%9C%20%EB%AA%A9%EB%A1%9D%EC%97%90%20%EB%8B%A4%EB%A5%B8%20%EB%AA%A9%EB%A1%9D%EC%97%90%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
예를 들어 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
$1
awk
file2.txt
(FNR
이제 보다 작음 )을 처리할 때NR
이 함수를 사용하여 입력 라인 전체에서 문자열을 찾습니다( )index
. 그렇다면 0보다 큰 시작 위치가 반환되어 인쇄되고, 그렇지 않으면 인쇄됩니다.patterns[FNR]
$0
index()
true
false
답변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"입니다.