
다음 두 파일이 있다고 가정해 보겠습니다.
꼬마 도깨비
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