열에서 가장 높은 값을 찾아 새 열의 값을 인쇄합니다.

열에서 가장 높은 값을 찾아 새 열의 값을 인쇄합니다.

나는 다음을 시도하고 있습니다.

6개의 열이 있는 탭으로 구분된 파일이 있습니다. 새 열을 만들고 6개 열의 각 행에서 찾은 가장 높은 값을 인쇄하고 싶습니다.

내 파일은 다음과 같습니다.

0       0.5     0.5     0       0       0
0       0       0.666667        0       0       0.333333
0.666667        0       0       0       0       0.333333
0.75    0       0       0       0       0.25
0.857143        0       0       0.142857        0       0
0.285714        0       0       0.714286        0       0
0       0.8     0       0.2     0       0
0       0.888889        0.111111        0       0       0
0       0.6     0.4     0       0       0
0       0       0.25    0.75    0       0

나는 이것을 얻고 싶다:

0       0.5     0.5     0       0       0   0.5
0       0       0.666667        0       0       0.333333    0.666667
0.666667        0       0       0       0       0.333333    0.666667
0.75    0       0       0       0       0.25    0.75
0.857143        0       0       0.142857        0       0   0.857143
0.285714        0       0       0.714286        0       0   0.714286
0       0.8     0       0.2     0       0   0.8
0       0.888889        0.111111        0       0       0   0.888889
0       0.6     0.4     0       0       0   0.6
0       0       0.25    0.75    0       0   0.75

내 요청을 추가할 새 열을 만드는 방법을 알고 있습니다.

awk -F'\t' -v OFS='\t' '{ $(NF+1)=???????? ; print}'

하지만 col1-col6 사이에서 가장 높은 값을 찾기 위해 awk에 요청하는 방법을 모르겠습니다. 이 작업은 각 행에 대해 수행되어야 합니다.

답변1

이는 매우 간단합니다. 모든 필드를 반복하고 행에서 어느 필드가 가장 높은지 확인하면 됩니다. 그런 다음 가장 높은 값을 (NF+1)번째 필드에 추가합니다.

awk 'BEGIN{FS=OFS="\t"} {max=$1; for (i=2;i<=NF;i++) {if (max<$i) {max=$i}}; $(NF+1)=max} 1' input.txt

합리적인 결과를 얻으려면 모든 행에 동일한 수의 열이 있는지 확인해야 합니다. 위의 프로그램은 차단 없이 행당 열 수가 다른 파일을 구문 분석할 수 있을 만큼 충분히 유연합니다.

고쳐 쓰다:

에서 언급했듯이에드 모튼의 답변,로 변경된 경우

awk 'BEGIN{FS=OFS="\t"} {max=$1; for (i=2;i<=NF;i++) {if (max<$i) {max=$i}}; print $0,max}' input.txt

awk이는 단일 필드가 수정될 때(새 필드 할당 포함) 행을 다시 작성하는 것을 방지하기 때문입니다.

관련 정보