파일에서 중복 항목을 찾아 첫 번째 일치 항목의 줄 끝에 문자를 추가하고 싶습니다.

파일에서 중복 항목을 찾아 첫 번째 일치 항목의 줄 끝에 문자를 추가하고 싶습니다.

파일에서 중복 항목을 찾으려고 하는데 일치 항목이 발견되면 줄 끝에 문자나 단어로 첫 번째 일치 항목을 표시합니다.

예를 들어 내 파일(test.html)에는 다음 항목이 포함되어 있습니다.

host= alpha-sfserver1
host= alphacrest3
host= alphacrest4
host= alphactn1 
host= alphactn2
host= alphactn3 
host= alphactn4
down alphacrest4

다음을 사용하여 중복 항목을 찾을 수 있습니다.- (중복 항목은 항상 2열에 있으므로 $2를 사용합니다.)

awk '{if (++dup[$2] == 1) print $0;}' test.html

마지막 항목(alphacrest4 아래)을 제거하지만 내가 원하는 것은 다음과 같은 단어나 문자로 중복 항목을 표시하는 것입니다.

host= alphacrest4 acked

어떤 도움이라도 매우 환영합니다.

답변1

파일을 두 번 처리해야 합니다. 처음 실행 시 스푸핑 콘텐츠를 파일에 작성합니다.

awk '{if (++dup[$2] == 1) print $2;}' test.html > dupes.txt

두 번째 실행에서는 모든 행을 파일 내용과 비교합니다.

awk 'BEGIN { while (getline var <"dupes.txt") { dup2[var]=1; }};
  { num=++dup[$2]
    if (num == 1) { if (1 == dup2[$2]) print $0 " acked"; else print $0;} }' \
test.html

답변2

전체 파일이 있으면 훨씬 쉬울 것입니다. host=또는로 시작하는 줄에만 관심이 있습니까 ?어느두 번째 필드? 일반적인 해결 방법을 보려면 다음을 시도해 보세요.

perl -e '@file=<>; 
         foreach(map{/.+?\s+(.+)/;}@file){$dup{$_}++};  
         foreach(@file){
              chomp; 
              /.+?\s+(.+)/; 
              if($dup{$1}>1 && not defined($p{$1})){
                 print "$_ acked\n";
                 $p{$1}++;}
              else{print "$_\n"}
          }' test.html 

위 스크립트는 먼저 전체 파일을 읽고 중복 항목을 확인한 다음 각 중복 행을 인쇄하고 "acked"를 인쇄합니다.

다음으로 시작하는 줄에만 관심이 있다고 가정하면 모든 것이 훨씬 더 down X간단 해집니다.

grep down test.html | awk '{printf $2}' | 
 perl -e 'while(<>){$dup{$_}++}open(A,"test.html"); 
   while(<A>){
    if(/host=\s+(.+)/ && defined($dup{$1})){
      chomp; print "$_ acked\n"}
    else{print}}' 

답변3

이는 도움이 될 수 있습니다:

하나의 선:

awk 'NR==FNR{b[$2]++; next} $2 in b { if (b[$2]>1) { print $0" acked" ; delete b[$2]} else print $0}' inputFile inputFile

설명하다:

awk '
NR==FNR { 

        ## Loop through the file and check which line is repeated based on column 2

        b[$2]++

        ## Skip the rest of the actions until complete file is scanned

        next
} 

## Once the scan is complete, look for second column in the array

$2 in b { 

        ## If the count of the column is greater than 1 it means there is duplicate.

        if (b[$2]>1) { 

            ## So print that line with "acked" marker

            print $0" acked"

            ## and delete the array so that it is not printed again

            delete b[$2]
        } 

        ## If count is 1 it means there was no duplicate so print the line

        else 
            print $0
}' inputFile inputFile

관련 정보