awk를 사용하여 3자 상호 작용 빈도에 따라 레코드를 삭제하는 방법

awk를 사용하여 3자 상호 작용 빈도에 따라 레코드를 삭제하는 방법

요인의 3차 상호작용 빈도(V2*V3*V4)가 5보다 낮은 경우 레코드를 삭제하는 방법.

원시 데이터

ID V2 V3 V4
101 2012 5 1
101 2012 5 1
101 2012 5 1
101 2012 5 1
102 2010 12 2
102 2012 12 2
102 2012 12 2
102 2012 12 2

답변1

"V2"는 2,000을 초과하고 1보다 작은 열은 없으므로 이러한 열의 곱은 주어진 샘플 데이터에서 항상 5보다 큽니다. 하지만:

awk '($2*$3*$4) > 5 { print } NR==1 { print }' /path/to/data

답변2

나는 주파수의 수학을 모르지만 awk를 좋아합니다! 다음은 테스트 파일의 각 레코드를 반복하고 숫자에 곱셈을 수행한 다음 비교하여 5보다 작은지 확인하는 스크립트입니다. 5보다 작으면 인쇄되지 않습니다. 그렇지 않으면 인쇄하십시오.

#!/usr/bin/awk -f BEGIN { print "ID V2 V3 V4 = PRODUCT"; } { TOTAL = int($1 * $2 * $3); if(TOTAL < 5) { # Don't print } else { print $1,"",$2,"",$3,"=",TOTAL; } }

답변3

동일한 요인으로 인해 ID가 변경될 수 있으므로 파일을 두 번 읽을 수 있습니다. 먼저 파일이 몇 번 있는지 계산한 V2_V3_V4다음 각 행을 다시 확인하고 처음에 더 크거나 같은 개수만 전달합니다 n(이 예에서는 5).

awk -vn=5 'NR==FNR{++z[$2"_"$3"_"$4];next};
FNR==1{print;next};z[$2"_"$3"_"$4]>=n' infile infile

관련 정보