예를 들어 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"입니다.