목록 파일을 사용하여 마스터 파일에서 두 번째 목록을 추출하고 일부 줄을 주석 처리합니다...어떻게?

목록 파일을 사용하여 마스터 파일에서 두 번째 목록을 추출하고 일부 줄을 주석 처리합니다...어떻게?

두 개의 파일이 있습니다 master.tbl.sites.lst

파일은 master.tbl포트 구성, 포트 이름, IP 주소 등이 포함된 사이트 목록입니다. 사이트 설명, 설명 등이 포함된 줄이 있지만 관련이 없습니다. 사이트 구성을 포함하는 줄은 다음과 같이 배열되며 공백으로 구분됩니다.:

{server} {SITE NAME} {port name} {configuration flags}

포트 이름은 소문자로 된 사이트 이름, 대시, "P" 및 포트 번호로 구성됩니다.

예:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

sites.lst파일 을 검색해야 하는 사이트 목록입니다 master.tbl.

주석 처리하고( #줄 시작 부분에 a 삽입) stoplist.lst다음 기준을 모두 충족하는 모든 줄의 서버 이름과 포트 이름을 추출해야 합니다.

  1. 다음에 나열된 사이트 이름이 포함되어 있습니다.sites.lst
  2. "-ADM"이 포함되어 있습니다.
  3. 포트 번호가 '2'보다 높습니다(예: hawaii23-P3).

위의 예에서 master.tbl파일은 다음과 같습니다.

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

...다음을 포함합니다( 에 있다고 stoplist.lst가정 ).HAWAII23sites.lst

server01 hawaii23-P3

master.lst거의 300,000줄이므로 수동으로 수행하는 것은...나쁜 일입니다.

답변1

해결책 은 다음과 같습니다 awk.

awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl

이것은 sites.lst먼저 읽고 $0"-ADM"(사이트 이름 + 문자열 -ADM)을 배열의 인덱스로 설정합니다 z. 그런 다음 세 번째 필드에서 master.tbl다음과 같이 값을 추출하는 작업을 처리 하고, 조건이 충족되면(두 번째 필드가 2에 속 하고 2보다 큼) 첫 번째와 세 번째 필드를 인쇄하고 해당 라인을 주석 처리합니다. 파일을 그 자리에서 편집하지는 않지만 모든 것이 정상이면 언제든지 다른 파일로 리디렉션하고 원본을 덮어쓸 수 있습니다(최근에는 옵션이 있음 ).-Ppzpstoplist.lst
gnu awk-i inplace

관련 정보