목록 파일을 사용하여 기본 파일에서 두 번째 목록을 추출하고 일부 줄을 주석 처리하는 것은 어떻습니까?

목록 파일을 사용하여 기본 파일에서 두 번째 목록을 추출하고 일부 줄을 주석 처리하는 것은 어떻습니까?

두 개의 파일이 있습니다 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"(예: 사이트 이름 + 문자열 ) . 그런 다음 세 번째 필드의 값을 추출 하고 조건이 충족되면(두 번째 필드가 2에 속하고 2보다 큼) 첫 번째와 세 번째 필드를 인쇄하고 행을 주석 처리합니다. 파일을 그 자리에서 편집하지는 않지만 모든 것이 잘 작동하면 언제든지 다른 파일로 리디렉션하고 원본을 덮어쓸 수 있습니다(요즘에는 해당 옵션이 있음).-ADMzmaster.tbl-Ppzpstoplist.lst
gnu awk-i inplace

관련 정보