다른 파일의 패턴과 일치하는 경우에만 파일의 줄을 변경합니다.

다른 파일의 패턴과 일치하는 경우에만 파일의 줄을 변경합니다.

다음 두 파일이 있다고 가정해 보겠습니다.

꼬마 도깨비

11 hello
22 wonderful
33 beach
44 today
55 is
66 great

가볍게 두드리기

11
44
55

나는 inp에서 뭔가를 하고 싶지만 pats의 라인에서만 하고 싶습니다. 예를 들어 끝에 +를 추가하고 싶습니다. 최종 결과는 다음과 같기를 바랍니다.

나가

11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

sed, awk 등을 사용하여 이를 수행하는 쉬운 방법이 있습니까? 간단히 말해서, 나는 (예를 들어 Python) 프로그램을 작성하고 싶지 않고 grep -f pats inp+ 같은 것을 함께 찾는 것을 선호합니다 sed 's/$/+/'.

편집하다:

예를 들어 다음과 같이 줄의 어느 곳에서나 발견된 패턴과 함께 작동하기를 원합니다.

꼬마 도깨비

11 hello
wonderful22
beach 33 front
to44day
is55
gr 66 eat

가볍게 두드리기

11
44
55

나가

11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat

답변1

배시 구문:

sed -f <(printf 's/^%d\>.*/&+/\n' $(<pats)) inp

내부 부분은 <()해당 행을 변환하기 위해 sed 프로그램을 인쇄합니다.

$ printf 's/^%d\>.*/&+/\n' $(<pats)
s/^11\>.*/&+/
s/^44\>.*/&+/
s/^55\>.*/&+/

구문 <()은 bash 프로세스 대체이므로 명령의 출력을 가져와서 파일에서 가져온 것처럼 사용할 수 있습니다. 그런 다음 sed -f sed_program inp실제로 파일을 변환 해야 합니다.

답변2

awk 'NR==FNR {pats[$1]++; next} $1 in pats {$2=$2"+"} 1' pats inp
11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

각 행의 위치가 일치하는지 확인하려면 inp본질적으로 유사한 접근 방식을 사용할 수 있지만 추출 부분을 사용하여 비교할 수 있습니다.match

awk 'NR==FNR {pats[$1]++; next} match($0,/[0-9]+/) && substr($0,RSTART,RLENGTH) in pats {$0=$0"+"} 1' pats inp2
11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat

(맞추고 싶다면평상복mode pats인 경우 array 의 요소를 명시적으로 반복하는 등 다른 접근 방식이 필요합니다 pats. )

답변3

이 시도...

awk 'NR==FNR{Arr[$0];next}{for(i=1;i<=NF;i++)for(j in Arr)if(match($i,j)){F=1;$0=$0"+"}else{F=0}}1' pat.txt input.txt
    11 hello+
    wonderful22
    beach 33 front
    to44day+
    is55+
    gr 66 eat

관련 정보