나는 다음을 시도하고 있습니다.
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
이는 단일 필드가 수정될 때(새 필드 할당 포함) 행을 다시 작성하는 것을 방지하기 때문입니다.