AWK: 소스 용어 뒤에 대상 단어를 삽입하는 빠른 방법

AWK: 소스 용어 뒤에 대상 단어를 삽입하는 빠른 방법

나는 awk에 익숙하지 않습니다. 198,058개의 임의 행에서 소스 용어 뒤에 단일 대상 용어를 삽입하기 위해 여기에 이 ​​코드가 있습니다.

awk -i inplace '(NR==FNR){a[$1];next}
    (FNR in a) && gsub(/\<Source Term\>/,"& Target Term")
     1
    ' <(shuf -n 198058 -i 1-$(wc -l < file)) file

file다음과 같은 문장이 포함되어 있습니다 .

David has to eat his vegetables .
This weather is very cold .
Can you please stop this music ? This is terrible music .
The teddy bear is very plushy .
I must be going !

예를 들어, "wetter"라는 단어를 "weather" 뒤에 삽입하려는 경우 특정 줄은 다음과 같습니다.

This weather Wetter is very cold .

소스 용어와 대상 용어 목록이 포함된 두 개의 다른 파일만 포함하도록 코드를 어떻게 다시 작성합니까?

소스 용어 파일의 이름이 지정 sourceterms되고 대상 용어 파일의 이름이 이라고 가정합니다 targetterms.

sourceterms이러한 용어가 포함된 목록이 있는 경우

vegetables
weather
terrible
plushy
going

targetterms다음 용어를 포함하세요 .

Gemüse
Wetter
schreckliche
flauschig
gehen

코드에서 file각 줄에 소스 용어가 포함되어 있는지 확인하고 그 뒤에 대상 용어를 삽입하도록 하여 코드는 file다음과 같습니다.

David has to eat his vegetables Gemüse .
This weather Wetter is very cold .
Can you please stop this music ? This is terrible schreckliche music .
The teddy bear is very plushy flauschig.
I must be going gehen!

위 코드를 다시 작성할 수 있나요?

답변1

ARGIND 및 단어 경계에는 GNU awk(OP가 사용하는)를 사용합니다.

$ cat tst.awk
ARGIND == 1 { olds[FNR] = "\\<" $1 "\\>"; next }
ARGIND == 2 { map[olds[FNR]] = "& " $1; next }
{
    for ( old in map ) {
        new = map[old]
        gsub(old,new)
    }
    print
}

$ awk -f tst.awk sourceterms targetterms file
David has to eat his vegetables Gemüse .
This weather Wetter is very cold .
Can you please stop this music ? This is terrible schreckliche music .
The teddy bear is very plushy flauschig .
I must be going gehen !

위의 내용에서는 소스에 정규식 메타 문자가 포함되어 있지 않고 대체 텍스트에 &역참조 메타 문자가 포함되어 있지 않다고 가정합니다. 또한 동일한 단어가 소스와 대상 모두에 나타나면 대체가 어떤 순서로 발생하는지 상관하지 않는다고 가정합니다.

관련 정보