소스 및 참조 파일에서 줄을 추출하고 결과 파일에 추가하는 방법은 무엇입니까? [복사]

소스 및 참조 파일에서 줄을 추출하고 결과 파일에 추가하는 방법은 무엇입니까? [복사]

문제가 있는데 그것을 알아낼 수 없습니다. 솔라리스입니다. 지나치게 단순화된 소스 및 참조 파일.

s.txt 소스 파일:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user10,cn=users,dc=domain

r.txt 참조 파일:

uniquemember: cn=user9,cn=users,dc=domain 
uniquemember: cn=user8,cn=users,dc=domain

참조 레코드 Uniquemember 파일을 사용하여 소스 파일의 cn=user9 줄과 위의 3줄을 추출하고 결과 파일 usermember_에 추가하는 스크립트를 원합니다.

.ldif 추가:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

답변1

r.txt다음의 값을 사용하려고 하면열쇠일치하는 여러 행을 추출 s.txt하고 시도해 보세요.

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= s.txt
  • r.txt기본(개행) 레코드 구분 기호를 사용하여 처리하고 u두 번째 공백으로 구분된 필드의 키를 사용하여 연관 배열을 구성합니다.
  • RS=전환하려면 레코드 구분 기호 설정을 해제 하세요.단락 모드두 번째 파일의 경우
  • 단락 모드에서 처리됩니다 s.txt. 즉, 각 빈 줄로 구분된 블록은 단일 레코드로 처리되며, $NF마지막 필드 값은 조회 값으로 사용될 수 있습니다.u
  • $NF존재 하는 경우 u전체 기록을 인쇄합니다.

일치하는 레코드 사이에 공백을 추가하려면:

GNU awk( )가 있는 경우 특수 변수를 사용하여 원래 단락 나누기를 다시 추가 gawk할 수 있습니다 .RT

gawk 'NR==FNR {u[$2]++; next} $NF in u {print $0 RT}' r.txt RS= s.txt

보다 일반적으로 일치하는 각 레코드 뒤에 추가 줄바꿈을 추가할 수 있습니다.

awk 'NR==FNR {u[$2]++; next} $NF in u {print $0 "\n"}' r.txt RS= s.txt

또는 기본값에 추가 줄 바꿈을 추가하십시오산출필드 구분 기호:

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= ORS='\n\n' s.txt

답변2

user귀하의 질문에 따르면 코드를 사용하여 키워드를 읽은 r.txt다음 해당 키워드를 검색하고 싶다는 것을 이해합니다 s.txt. 마지막으로 키워드와 관련된 줄을 (처음 세 줄과 함께) 인쇄합니다 in s.txt. 다음 줄을 다음 파일에 쓸 수 있습니다 "code".

#!/bin/bash
if  [[ `egrep user9 r.txt` ]] ; then 
grep -B 3 user9 s.txt
fi

이 파일에 권한을 부여 "code"하고 다음과 같이 터미널에서 실행하십시오.

code > add.ldif

출력은 다음과 같습니다

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

user9다음과 같은 항목에 두 개가 있다고 가정해 보겠습니다 s.txt.

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user18,cn=users,dc=domain

dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain

이전 코드는 user9에 대한 두 개의 항목을 찾습니다.

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain
--
dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain

관련 정보