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