
B열의 최대값을 구하고 싶습니다.그리고B열 값이 최대값의 20% 이상인 모든 행을 유지합니다.
입력 데이터
A B C D E
2 79 56 SD L
1 09 67 JK S
9 60 37 KD G
0 10 47 SO E
원하는 출력
A B C D E
2 79 56 SD L
9 60 37 KD G
나는 사용해 보았지만 awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {if ($2 >= (0.1*max)) print}' file_in > file_out
이것은 내 파일의 마지막 줄인 것처럼 보이는 것만 인쇄합니다.
답변1
에서 다시 살펴볼 수 있으려면 배열의 모든 라인을 저장해야 합니다 END{ }
. 또는 파일을 두 번 스캔하십시오. 따라서 모든 값과 줄을 저장합니다.
awk 'NR == 1 {header=$0; next} # save the header
{ lines[NR] = $0; values[NR] = $2; # save the line and 2nd field
if ($2 > max) max = $2; } # update max
END { print header; # in the end, print the header
for (i = 1 ; i <= NR ; i++) { # (we skipped line 0)
if (values[i] >= max * 0.2) # print lines where $2 was high enough
print lines[i]; } } ' file_in
답변2
와 함께밀러:
1) 예쁘게 인쇄된 데이터:
$> mlr --from data --ipprint --otsv cat
A B C D E
2 79 56 SD L
9 60 37 KD G
B
2) 필드에 최대 필드 추가 B_max
:
$> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F
A B C D E B_max
2 79 56 SD L 79.000000
1 09 67 JK S 79.000000
9 60 37 KD G 79.000000
0 10 47 SO E 79.000000
3) 다음과 같은 경우 라인을 필터링합니다 B >= B_max * 0.2
.
$> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F then filter '$B >= $B_max*0.2'
A B C D E B_max
2 79 56 SD L 79.000000
9 60 37 KD G 79.000000
4) 그런 다음 다시 cut
떠나십시오 B_max
.
$> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F then filter '$B >= $B_max*0.2' then cut -x -f B_max
A B C D E
2 79 56 SD L
9 60 37 KD G