그래서 한 필드의 문자열을 부분적으로 일치시킨 다음 해당 필드를 별도 파일의 다른 필드와 함께 사용하려고 했습니다.
입력 예 -
1.txt를 입력하세요.
example/world
example/forever
2.txt를 입력하세요
example123
example234
예상 출력.txt:
example123/world
example234/world
example123/forever
example234/forever
따라서 기본적으로 AWK를 사용하여 -를 사용하여 input1.txt를 2개의 필드로 분할합니다.
awk -F"/"
이는 첫 번째 행 $1이 이고 example
$2가 임을 의미합니다.world
그런 다음 input2.txt의 $1을 부분적으로 일치시켜 input2.txt에 해당 내용이 포함되어 있는지 확인한 다음 example
해당 일치 항목을 찾아서 input1의 $2와 결합합니다.
답변1
awk -v file2="input2.txt" -F'/' '{
while ((getline line < file2) > 0){
if (line ~ "^"$1) print line FS $2
}
close(file2)
}' input1.txt
이것은 기본적으로 당신이 설명하는 것입니다. input1.txt
모든 라인 각각에 대해 의 input2.txt
시작 부분을 읽고 와 비교합니다 $1
. 일치하는 항목이 있는 경우 input2.txt
행은 구분 기호 /
및 와 함께 인쇄됩니다 $2
.
답변2
부분 문자열 일치가 작동하는 방식은 다음과 같습니다.
$ cat tst.awk
BEGIN { FS=OFS="/" }
NR==FNR {
strings[$1]
next
}
{
for (string in strings) {
if ( index(string,$1) ) {
print string, $2
}
}
}
$ awk -f tst.awk input2.txt input1.txt
example234/world
example123/world
example234/forever
example123/forever
문자열의 시작 부분에서만 일치시키려면 index(...)
로 변경하면 됩니다 index(...) == 1
.
답변3
awk
제공된 예제 파일을 기반으로 한 또 다른 솔루션:
$ cat demo.awk
BEGIN { FS="/"; while ((getline < "input2.txt" ) > 0 ) { s[i++] = $0 } }
{ for (i in s)
if (s[i] ~ "^"$1) { print s[i] FS $2 }
# alternative tests
# if (index(s[i], $1)) { print s[i] FS $2 }
# if (index(s[i], $1) == 1) { print s[i] FS $2 }
}
산출:
$ awk -f demo.awk input1.txt
example123/world
example234/world
example123/forever
example234/forever
$