>

다음과 같은 파일이 많이 있습니다 :

파일 1 :

408.60 0.0847 
 370.03 0.1571 
 307.49 0.1492 
 297.12 0.0708 
 274.36 0.1989 
 251.27 0.1640

파일 2 :

391.06 0.0589 
 368.55 0.2293 
 313.87 0.0369 
 299.94 0.1432 
 288.61 0.2125 
 252.57 0.1238

파일 3 :

395.74 0.2439 
 372.76 0.0658 
 323.80 0.0026 
 287.41 0.3337 
 268.44 0.0860 
 259.44 0.0680

선택 기준에 따라 각 입력 파일의 특정 줄을 선택하고 싶습니다. 선택 기준은 다음과 같습니다.

a) 첫 번째 열은 290.00보다 큰 숫자 여야합니다

b) 두 번째 열은 가장 높은 숫자 여야합니다

c) 줄을 인쇄

출력은 다음과 같아야합니다 :

370.03 0.1571
368.55 0.2293
395.74 0.2439


  • 답변 # 1

    직접 솔루션

    for file in file{1..3}; do
        sort -rk2 "$file" | awk '$1 > 290{print;exit}'
    done
    
    

    또는 awk없이

    for file in file{1..3}; do
        while read field1 field2 ; do
            [ "field1" -gt 290 ] && { echo $field1 $field2; break; }
        done <(sort -rk2 "$file")
    done
    
    

    또는 혼자서

    awk '
        FNR == 1 || $1 > 290 && max < $2 {
            max = $2
            if (FNR == 1 && max) {
                print line
                if ($1 <= 290)
                    max = -1     }
            line= $0                     }
        END {
            print line }
        ' file{1..3}
    
    

  • 답변 # 2

    for f in file1 file2 file ; do cat $f | awk '{printf("%s %s\n",$2,$1)}' | sort -n | tail -n 1 | awk '{printf("%s %s\n",$1,$2)}' ; done
    
    

  • 답변 # 3

    두 번째 필드를 배열 인덱스로 사용하고 asorti 를 사용하여 작동하는 GNU awk가있는 경우이를 수행하는 한 가지 방법이 있습니다.  각 파일의 끝에서 해당 색인을 정렬하려면

    gawk '
      BEGINFILE{delete a}
      $1+0 > 290 {a[$2]=$0; next;}
      ENDFILE{n = asorti(a,b); print a[b[n]]}
    ' file{1..3}
     370.03 0.1571 
     368.55 0.2293 
     395.74 0.2439
    
    

관련 자료

  • 이전 bash - 터미널 프롬프트가 위에 작성되었습니다
  • 다음 Lynx는 파일 및 다운로드 링크에서 URL을 읽습니다