여러 줄 패턴 일치 및 줄 삭제 - sed/awk/grep

여러 줄 패턴 일치 및 줄 삭제 - sed/awk/grep

입력.txt

-------
Database alias = ABC
Node name = node01
Hostname = hostnode01
Service name = 12345
-------
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......

예상 출력

-------
Database alias  = ABC
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......

호스트 이름과 서비스 이름(중복된 경우)에 대한 중복 값을 제거하거나, 그 '-------사이에 2개의 행이 있는 경우 '.' 사이의 행을 제거한다고 할 수 있습니다.

다중 일치를 위해 sed를 사용해 보았지만 원하는 o/p를 얻지 못했습니다.

sed '/-------/{$!N;/\n.*Hostname/d;}' Input.txt

답변1

암소 비슷한 일종의 영양awk방법:

awk 'BEGIN{ 
         RS = ORS = "-------\n";
         pat = "^Hostname += ([^ ]+)\nService name += ([^ ]+)\n$";  
     }
     NR == FNR{ 
         if (match($0, pat, a)) { items[a[1], a[2]]++ } 
         next 
     }
     match($0, pat, a) && (a[1], a[2]) in items \
     && items[a[1], a[2]] > 1{ next }1' inout.txt input.txt

산출:

-------
Database alias = ABC
Node name = node01
Hostname = hostnode01
Service name = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......
-------

답변2

이것은 작업이 아닙니다 sed(연속적인 중복 항목에 의존해서는 안 됩니다). 사용 awk:

  1. 레코드 구분 기호를 정규식으로 설정합니다 ^-+$.

  2. 인덱스가 호스트 이름과 서비스 이름을 연결한 연관 배열을 사용하십시오. 읽은 레코드의 경우 해당 레코드가 아직 존재하지 않는 경우에만 배열에 배치됩니다.

  3. 파일 처리가 끝나면 ----구분 기호 줄을 사용하여 별도의 줄 형식으로 배열의 모든 요소를 ​​인쇄합니다.

답변3

예제 데이터세트의 단순성은 실제 사용 사례에서는 일반적이지 않을 수도 있지만 게시한 예제의 사소한 특성을 고려하면 grep이것만으로도 충분합니다.

$ grep --no-group-separator -A4 '^Database alias' input.txt 
Database alias = ABC
Node name = node01
Hostname = hostnode01
Service name = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......

관련 정보