특정 열에서 최대값을 찾는 방법(예: 5행마다)

특정 열에서 최대값을 찾는 방법(예: 5행마다)

대용량 파일에서 5줄마다 최대값을 찾는 방법 다음과 같은 파일이 있습니다.

186 5   24.0772 24.061  18.5996 2.14E+06  
123 4   25.838  29.4805 25.8075 1.25E+06  
47  4   24.0637 27.5751 18.7376 915260  
44  4   22.2291 25.915  18.7651 2.13E+06  
22  4   20.5204 31.1934 25.8222 958569  
2   4   18.6967 24.0007 24.0214 2.35E+06  
11  4   18.66   25.8085 22.2719 1.99E+06  
3   4   20.4814 22.3203 24.1144 2.02E+06  
4   4   20.5083 24.0258 22.2133 1.90E+06  
23  4   22.2675 20.584  24.0367 2.05E+06  
24  4   24.1038 18.7206 24.0185 2.33E+06  
25  4   24.0527 20.4908 22.3148 3.19E+06  
30  4   22.2784 24.118  20.574  3.06E+06  
31  4   22.2229 22.3165 22.3832 1.35E+06  
32  4   22.3877 23.9854 24.0684 2.45E+06  
33  4   24.0543 22.2423 24.0071 3.66E+06  
34  4   23.9802 24.1058 22.2199 2.71E+06  
185 5   24.0362 22.2425 20.4836 2.73E+06  
77  4   25.8136 20.4698 24.0521 2.94E+06  
189 5   25.8148 24.0693 24.0799 1.50E+06  

따라서 이 파일의 열 6에 있는 모든 5개 행의 최대값을 반환하려고 하므로 결과는 다음과 같아야 합니다.

2.14E+06  
2.35E+06  
....
....

awkLinux에서는 어떤 방법이든 다른 방법을 통해 수행할 수 있습니다.

답변1

$ awk '(NR-1) % 5 == 0 { m=$1; for (i=2; i<=NF; ++i) m=($i>m ? $i : m); print m }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06

또는 명시적인 if선언을 사용하세요.

$ awk '(NR-1) % 5 == 0 { m=$1; for (i=2; i<=NF; ++i) if ($i > m) m = $i; print m }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06

이 프로그램은 라인 1, 11, 16 등의 코드 블록을 트리거하는 awk데 사용됩니다 . (NR-1) % 5 == 0이 블록은 행에서 최대값을 찾아서 인쇄합니다.

NR는 현재 레코드 번호(기본값은 행 번호) NF이고 현재 레코드의 필드(열) 수입니다.

네가 항상 그걸 원한다면마지막컬럼, 더 빠른 사용

$ awk '(NR-1) % 5 == 0 { print $NF }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06

답변2

$ awk '{max = ((max=="") || ($6 > max) ? $6 : max)} !(NR%5){print max; max=""}' file
2.14E+06
2.35E+06
3.19E+06
3.66E+06

답변3

$ perl -lane '
    $F[5] > ($m //= -InF) and $m = $F[5];
    $. % 5 or print, undef for $m;
' file 

2.14E+06
2.35E+06
3.19E+06
3.66E+06

관련 정보