다음 테이블이 있습니다.
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%에 대한 임계값을 결정합니다. 다른 레코드에서는 필드가 임계값보다 크거나 같은지 여부에 따라 0
5 번째 필드를 설정합니다. 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