파일에서 중복 항목을 찾으려고 하는데 일치 항목이 발견되면 줄 끝에 문자나 단어로 첫 번째 일치 항목을 표시합니다.
예를 들어 내 파일(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