Awk - 열의 값을 변수와 비교하여 각 ID가 전달된 횟수를 계산합니다.

Awk - 열의 값을 변수와 비교하여 각 ID가 전달된 횟수를 계산합니다.

해결책을 찾으려고 노력했지만 지금은 도움이 필요합니다.

먼저 입력으로 다음 구조의 대용량 파일(5.5G)이 있습니다.

scaffold4691_size302    2       T       1
scaffold4691_size302    3       A       1
scaffold4691_size302    4       a       1
scaffold4691_size302    5       a       1
scaffold4691_size302    6       g       2
scaffold4691_size302    7       c       2
scaffold4691_size302    8       c       2
scaffold4692_size187    68      g       4
scaffold4692_size187    69      c       4
scaffold4692_size187    70      a       4
scaffold4692_size187    71      a       4

내가 원하는 것은 첫 번째 열($1)의 각 ID에 대해 네 번째 열($4)의 값이 X보다 크거나 같은 횟수(예: 장난감 모델의 X=4)를 계산하는 것입니다.

그래서 나는 입력으로 다음을 기대합니다.

scaffold4691_size302    0
scaffold4691_size187    4

파이썬이 더 편해서 쉽게 할 수 있었는데 크기가 너무 큽니다.

지금까지 나는 이것을 했습니다:

awk 'NR>1 { scf=$1; { if ($4>=4){count++;}}} {print scf "\t" count}' toyModel

하지만 모든 행과 합계가 반환됩니다. 새로운 ID의 개수를 새로 고치는 방법을 알고 싶습니다.

답변1

각 ID에 대한 개수를 누적하고 파일을 처리한 후 결과를 인쇄해야 합니다.

awk '!counts[$1] { counts[$1] = 0 }; $4 >= 4 { counts[$1]++ }; END { for (key in counts) print key, counts[key] }' toyModel

첫 번째 문은 우리가 측정하는 ID가 기준과 절대 일치하지 않음을 보장합니다(최종 출력은 0입니다). 두 번째는 일치하는 행의 수를 증가시킵니다. 마지막 문은 키(ID)를 반복하고 키와 일치 개수를 인쇄합니다.

이 메소드의 크기가 너무 크고(배열이 counts너무 커짐) ID가 파일에서 연속되어 있는 경우 대신 이 메소드를 사용할 수 있습니다.

awk 'curid != $1 { if (NR > 1) print curid, count; curid = $1; count = 0 }; $4 >= 4 { count++ }; END { print curid, count }' toyModel

이는 현재 ID와 개수를 유지하고 ID가 변경될 때(마지막으로) 이를 인쇄합니다. 네 번째 필드가 4보다 클 때마다 개수가 증가하고 ID가 변경될 때마다 재설정됩니다.

답변2

perl -lane '$h{$F[0]} += $F[3] >= 4 ? 1 : 0}{print "$_\t$h{$_}" for keys %h' toyModel

관련 정보