해결책을 찾으려고 노력했지만 지금은 도움이 필요합니다.
먼저 입력으로 다음 구조의 대용량 파일(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