다음 필드를 포함하는 tmp.log 파일이 있습니다.
description ID valueA valueB valueC
xxx x 1 1 1
yyy y 3 100 23
zzz z 0 0 0
aaa a 4 4 4
"값" 열에서 동일한 값을 가진 모든 데이터 요소를 삭제하고 싶습니다.
description ID valueA valueB valueC
yyy y 3 100 23
나는 사용하고있다
cat tmp.log | tail -n+2 | awk '!a[$3$4$5]++'
하지만 여전히 중복된 값이 인쇄됩니다. 이것이 잘못된 이유와 해결 방법은 무엇입니까?
답변1
3, 4, 5열이 동일한 행을 삭제합니다.
awk '!($3==$4&&$4==$5)' data_file
다른 행과 동일한 3,4,5 열이 있는 행을 삭제합니다.
awk '!seen[$3,$4,$5]++' data_file
n개 열 업데이트
동일한 열 3, 4, ...n이 있는 행을 삭제합니다.
awk 'v=0;{for(i=4;i<=NF;i++) {if($i!=$3) {v=1; break;}}} v' data_file
v=0
각 레코드의 v를 0으로 재설정for(i=4;i<=NF;i++) {if($i!=$3) {v=1; break;}}
네 번째 열에서 마지막 열까지 반복하고, v를 1로 설정하고, 세 번째 열과 다르면 중단됩니다.v
v가 0이 아니면 인쇄합니다.
다른 행과 동일한 3,4,...n 열이 있는 행을 삭제합니다.
awk '(l=$0) && ($1=$2=""); !seen[$0]++ {print l}' data_file
(l=$0) && ($1=$2="")
원래 행을 백업하고 첫 번째 열과 두 번째 열을 지우고 다시 빌드하세요$0
. 이 표현식은 항상 false로 평가되므로 아무것도 인쇄되지 않습니다. 에&&
비해 우선순위가 높기=
때문에()
필요한 것입니다.!seen[$0]++ {print l}
일반적인seen
방법은 이전에 본 적이 없는 경우 원래 줄을 인쇄하는 것입니다.
답변2
주문하다:awk '$3!=$4 && $4!=$5&& $5 !=$3 {print $0}' filename
산출
awk '$3!=$4 && $4!=$5&& $5 !=$3 {print $0}' filename
description ID valueA valueB valueC
yyy y 3 100 23