필드 중 하나("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