awk 부분 문자열 일치

awk 부분 문자열 일치

그래서 한 필드의 문자열을 부분적으로 일치시킨 다음 해당 필드를 별도 파일의 다른 필드와 함께 사용하려고 했습니다.

입력 예 -

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
$

관련 정보