다른 샘플의 유전자 개수가 포함된 행렬이 있습니다.
Col1: GeneName
Col2: Length
Col3;Col4;Col5; Counts for genes in sampleA/sampleB/sampleC
Col6;Col7;Col8; Total counts in sampleA/sampleB/sampleC
다음은 예제 매트릭스입니다.
A1BG 1758 53 4373 207 46005749 43849471 31554941
A1BG-AS1 2126 5 88 12 46005749 43849471 31554941
A1CF 9695 8882 3522 437 46005749 43849471 31554941
A2M 5399 15963 12325 7227 46005749 43849471 31554941
A2M-AS1 6660 50 33 36 46005749 43849471 31554941
다른 샘플에 대해서는 counts_sampleA / (total_counts_sampleA*Length) 등으로 나누고 싶습니다.
파일의 고양이 | awk 'BEGIN {OFS="\t"} { print $1,$2,$3/($6*$2),$4/($7*$2),$5/($8*$2) }'
이는 예상된 결과이다
A1BG 1758 6.55307e-10 5.67278e-08 3.73151e-09
A1BG-AS1 2126 5.11204e-11 9.43963e-10 1.78875e-10
A1CF 9695 1.99136e-08 8.28471e-09 1.42845e-09
A2M 5399 6.42672e-08 5.20606e-08 4.24207e-08
A2M-AS1 6660 1.63186e-10 1.12999e-10 1.71301e-10
잘 작동하지만 행렬이 큰 경우에는 잘 작동하지 않습니다. column3-colum102에 geneCountinEachSample이 있고 Coulmn103-column202에 totalCountinEachSample이 있는 100개의 샘플이 있는 경우 어떻게 작성해야 합니까?
더 많은 샘플이 있을 때 원하는 만큼의 열을 처리할 수 있도록 for 루프와 함께 사용하고 싶습니다.
cat inFile | awk 'BEGIN {OFS="\t"} { row=NF; samples=3; size=$samples+2; for ( i=3; i<=$size; i++); END print $i/$[$i+$samples] }'
이 작업을 수행하는 방법에 대한 제안 사항. 감사해요!
답변1
글쎄, 당신은 거의 답을 얻었습니다:
awk '
{cols=((NF/2) + 1)
for (i=1; i <= cols; i++) {
if (i >= 3) {
count_index= i + cols - 2
printf("%s\t", 1.0 * $i / ($count_index * $2))
} else {
printf("%s\t", $i)
}
}
printf("\n")
}' inFile
사용법은 cat file | awk ...
차선책입니다. awk는 파일을 매개변수로 직접 처리하므로 그렇게 하는 것이 awk ... < infile
더 저렴합니다 .고양이의 쓸모없는 사용.
답변2
perl -F'\s+' -lane '$,="\t"; # OFS made a TAB
my($gN, $gL) = splice @F, 0, 2; # store gene name & length
print $gN, $gL, map { sprintf "%.5e", $F[$_] / ( $F[$_+@F/2] * $gL ) } 0 .. @F/2-1;
' gene_samples.file
FS
하나 이상의 공백으로 설정합니다.ORS = RS = \n
@F
주어진 레코드를 보유하는 필드입니다.splice
오프셋 0에서 시작하는 2개의 요소를 삭제하고 배열 크기를 줄입니다.- OP 사양에 따르면 @F에 유지되는 것은 짝수 요소입니다. 전반부는 counts_for_each_sample이고 후반부는 total_count_for_each_sample입니다.
결과
A1BG 1758 6.55307e-10 5.67278e-08 3.73151e-09
A1BG-AS1 2126 5.11204e-11 9.43963e-10 1.78875e-10
A1CF 9695 1.99136e-08 8.28471e-09 1.42845e-09
A2M 5399 6.42672e-08 5.20606e-08 4.24207e-08
A2M-AS1 6660 1.63186e-10 1.12999e-10 1.71301e-10