열에서 상위 2% 값을 선택한 다음 참이면 1, 거짓이면 0을 어떻게 쓰나요?

열에서 상위 2% 값을 선택한 다음 참이면 1, 거짓이면 0을 어떻게 쓰나요?

다음 테이블이 있습니다.

CHR BP  SNP CM  AN1
1 15558213 rs2845371 0 -1.10837716961610
1 15558230 rs16981507 0 -1.13721847993853
1 15558586 rs5993924 0 -1.34239265871644
1 15563103 rs3016111 0 -1.61194237184708

5열의 값 중 상위 2%를 선택하여 참이면 1, 거짓이면 0을 쓰고 싶습니다.

if...else 명령을 사용해야 할 것 같습니다. 그러나 첫 번째 행을 정의하는 방법을 모르겠습니다(col5=top2%인 경우).

if col5= top2%
then
awk '{$5=1 ; print ;}' file
else
awk '{$5=0 ; print ;}' $file
fi

이 문제를 해결하는 방법을 안내해 주시면 감사하겠습니다.

답변1

awk '
  PASS==1{
    if (FNR==2){ min=max=$5; next }
    min=($5 < min ? $5 : min)
    max=($5 > max ? $5 : max)
    next
  }
  FNR==1{ threshold=(max - ((max - min) / 50)) }
  FNR>1 { $5=($5 >= threshold) }
  1
' PASS=1 file PASS=2 file

두 단계로 입력 파일을 읽습니다.

1차 통과: 5번째 필드의 최소값과 최대값을 결정합니다.
두 번째 통과: 첫 번째 레코드 값의 상위 2%에 대한 임계값을 결정합니다. 다른 레코드에서는 필드가 임계값보다 크거나 같은지 여부에 따라 05 번째 필드를 설정합니다. 1그런 다음 기록을 인쇄하십시오.

산출:

CHR BP  SNP CM  AN1
1 15558213 rs2845371 0 1
1 15558230 rs16981507 0 0
1 15558586 rs5993924 0 0
1 15563103 rs3016111 0 0

답변2

어쩌면 먼저 정렬할 수도 있습니다.

cat FileName.txt | sort -r -n -k5 | head

관련 정보