일부 줄이 주석 처리되거나 처음에 다른 태그가 있을 수 있지만 텍스트 파일에서 중복된 줄을 찾는 방법은 무엇입니까?

일부 줄이 주석 처리되거나 처음에 다른 태그가 있을 수 있지만 텍스트 파일에서 중복된 줄을 찾는 방법은 무엇입니까?

다음과 같이 줄이 혼합된 텍스트 파일이 있습니다.

###  Comments

# Comments
86.242.200.81 banana.domain.net          # comment
86.242.200.3 orange.domain.net
31.28.225.81 monkey.anotherdomain.net

51.18.33.4 puffin.domainz.com
#31.28.220.80 monkey.anotherdomain.net   # comment
86.242.201.3 orange.domain.net

중복된 호스트 도메인을 찾는 방법은 무엇입니까?

monkey.anotherdomain.net이 경우에는 두 가지 가 있습니다. orange.domain.net

이를 염두에 두고...

  • 항목 뒤의 주석은 중복되지 않을 수 있으므로 무시해야 합니다.
  • 해당 행을 주석 처리한 경우에도 중복된 행이 발견되어야 합니다.
  • IP 주소의 차이는 무시되어야 합니다.

답변1

흥미 롭군.

먼저, 제거해야 합니다.뒤따라다음과 같은 댓글:

86.242.200.81 banana.domain.net          # comment

다음 명령을 사용하여 이 작업을 수행할 수 있습니다(공백만 있고 탭은 없다고 가정).

sed 's/  *#.*//'

호스트 파일에 탭이 있는 경우 먼저 다음 명령을 실행할 수 있습니다.

tr '\t' ' '

그런 다음 IP 주소 앞의 단일 해시 문자로 정의한 "이 줄을 주석으로 처리" 주석을 제거해야 합니다. 다음과 같이 삭제할 수 있습니다.

sed '/^#[0-9]/ s/^#//'

위 내용을 종합하면 다음과 같습니다.

###  Comments

# Comments
86.242.200.81 banana.domain.net
86.242.200.3 orange.domain.net
31.28.225.81 monkey.anotherdomain.net

51.18.33.4 puffin.domainz.com
31.28.220.80 monkey.anotherdomain.net
86.242.201.3 orange.domain.net

두 번째 열( )을 정렬 하면 sort -k2이름별로 정렬된 목록이 표시됩니다.

86.242.200.81 banana.domain.net
# Comments
###  Comments
31.28.220.80 monkey.anotherdomain.net
31.28.225.81 monkey.anotherdomain.net
86.242.200.3 orange.domain.net
86.242.201.3 orange.domain.net
51.18.33.4 puffin.domainz.com

이제 첫 번째 필드를 무시하도록 지시하면 uniq중복 항목 찾기를 적용할 수 있습니다.uniq

uniq -c -f 1

이는 우리에게 다음을 제공합니다.

  2 
  1 86.242.200.81 banana.domain.net
  1 # Comments
  1 ###  Comments
  2 31.28.220.80 monkey.anotherdomain.net
  2 86.242.200.3 orange.domain.net
  1 51.18.33.4 puffin.domainz.com

따라서 개수가 2 이상인 행을 찾으면 중복된 항목이 발견됩니다. 이것을 종합하면 다음과 같은 결과를 얻을 수 있습니다.

#!/bin/sh

tr '\t' ' ' |
sed '
    /^#[0-9]/ s/^#//
    s/  *#.*//
    /^ *$/ d
' |
sort -k2 |
uniq -f 1 -c |
awk '$1 > 1 {print}'

위 스크립트의 마지막 문은 awkcount 를 사용하여 (field1)에서 행을 찾습니다.uniq> 1

위 스크립트를 실행하면 다음과 같습니다.이것.

답변2

만약에실제데이터 시작 부분에 설명하는 것과 같은 주석 줄이 존재하며 무시됩니다. 무시할 중요한 주석 줄을 구별하는 방법에 대한 가정 없이 포인트 2가 어떻게 만족될지 모르겠습니다. 중요한 주석 줄의 두 번째 필드에 마침표가 포함되어 있다고 가정합니다.

awk 'NF && $2 ~ /[.]/{++a[$2]}; 
 END{for (k in a) if(a[k] > 1) print k}' file
orange.domain.net
monkey.anotherdomain.net

답변3

sed 's/\(.\)#.*/\1/' file | cut -f 2 -d\ | sort | uniq -d
  • 앞에 오는 댓글 삭제sed 's/\(.\)#.*/\1/'
  • 두 번째 열만 필터링cut -f 2 -d\
  • 다음 비교를 위해 행을 정렬하세요.sort
  • 그리고 사본만 인쇄하세요.uniq -d

이와 같은 줄을 가질 수 없다면 주의하세요.

86.242.200.81 banana.domain.net#comment

위 내용을 다음과 같이 단순화할 수 있습니다.

cut -f 2 -d\  file | sort | uniq -d

댓글은 세 번째 필드로 처리되기 때문입니다.

답변4

짧고 간단하며 직접적인 접근 방식은 어떻습니까?

awk '/#*\d/{print $2}' file | sort | uniq -d

이를 통해 호스트 도메인 중복이 파운드 기호(#)로 주석 처리된 경우에도 보고될 수 있습니다.

관련 정보