AWK를 사용하여 데이터프레임의 행을 필터링하여 특정 필드의 X 인스턴스가 있는 항목만 표시

AWK를 사용하여 데이터프레임의 행을 필터링하여 특정 필드의 X 인스턴스가 있는 항목만 표시

필드 중 하나("ID")가 고유 식별자에 해당하는 대규모 데이터 프레임이 있습니다. 그러나 추가 측정("structureA" 및 "structB")의 이진 조합에 따라 이 값의 인스턴스가 여러 개 있습니다. 초기 데이터 프레임에 인스턴스가 4개만 있는 ID와 관련된 측정값을 표시하기 위해 awk를 사용하여 행을 필터링하는 방법을 고안하고 싶습니다.

먼저 uniq -c 또는 awk 배열을 사용하여 인스턴스 수를 계산하고 파일에 저장한 다음 해당 새 파일을 사용하여 awk 배열 및 FNR==NR을 사용하여 초기 데이터 프레임을 필터링하는 두 부분으로 이 작업을 수행하는 것을 상상할 수 있습니다. 그러나 나는 awk가 개수를 집계한 다음 조건(예: 항목이 X번 발생함)을 충족하는 일련의 행을 인쇄하는 방법이 있을 수 있기를 바랐습니다.

> Initial table
ID  structureA  structureB
sample_1    1   1
sample_2    1   1
sample_2    2   1
sample_2    1   2
sample_2    2   2
sample_3    1   1
sample_3    2   1
sample_3    3   1
sample_4    1   1
sample_4    2   1
sample_4    3   1
sample_4    4   1

> Desired table
ID  structureA  structureB
sample_2    1   1
sample_2    2   1
sample_2    1   2
sample_2    2   2
sample_4    1   1
sample_4    2   1
sample_4    3   1
sample_4    4   1

답변1

awk 스크립트를 개선한 Ed Morton에게 감사드립니다.

awk -v n=$1 '
NR==1
{a[$1]=($1 in a ? a[$1] RS : "") $0}
END{for(i in a){if(gsub(RS,"&",a[i])==n-1){print a[i]}}}
' "$2"

NR==1제목을 인쇄하세요. 마지막 문은 각 배열 요소에 행 수를 확인하기 위해 분할 함수를 호출합니다. 4개이면 인쇄하세요.

./script 4 file실행 가능하게 만든 후 다음을 사용하여 호출할 수 있습니다(첫 번째 인수는 반복 횟수, 두 번째 인수는 파일 이름).

이 답변은 동일한 첫 번째 필드가 있는 줄이 입력 파일에서 서로 옆에 있어야 한다고 강제하지 않습니다.

답변2

$ awk -v n=4 '
    NR==1 { print; next }
    $1 != prev { if (cnt==n) printf "%s", buf; prev=$1; cnt=0; buf="" }
    { cnt++; buf=buf $0 ORS }
    END { if (cnt==n) printf "%s", buf }
' file
ID  structureA  structureB
sample_2    1   1
sample_2    2   1
sample_2    1   2
sample_2    2   2
sample_4    1   1
sample_4    2   1
sample_4    3   1
sample_4    4   1

관련 정보