여러 열을 기반으로 중복된 값을 제거하는 방법

여러 열을 기반으로 중복된 값을 제거하는 방법

다음 필드를 포함하는 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로 설정하고, 세 번째 열과 다르면 중단됩니다.
  • vv가 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

관련 정보