awk 모든 행을 열별로 다른 행으로 나눕니다.

awk 모든 행을 열별로 다른 행으로 나눕니다.

file1.txt의 모든 행을 file2.txt의 단일 행에 있는 해당(열별) 값으로 나누려고 합니다.

고양이 파일 1.txt

1       2.5     3
7       7       7
1       3       5

고양이 파일 2.txt

1   3   5

이 문제에 대해 제안된 해결 방법을 따르십시오.https://stackoverflow.com/questions/44908195/awk-multiplication-of-all-rows-in-a-table-with-first-row-of-the-table, 다음 코드를 생각해 냈습니다.

cat file2.txt file1.txt | awk 'NR==1{split($0,m);CONVFMT="%.5f\t";next} {for (i=1;i<=NF;i++) $i=$i/m[i]} 1'

그러나 행 중 하나의 모든 값이 1이고 CONVFMT가 정수에서 작동하지 않기 때문에 출력 파일의 형식이 엉망입니다. 이 문제를 해결하기 위해 CONVFMT 대신 탭 구분 기호가 있는 printf를 사용하는 것을 고려하고 있지만 실제 파일에 가변 개수의 열이 있다는 점을 고려하면 $1, $2 등을 사용하여 하드코딩된 솔루션을 원하지 않습니다. 나는 awk에 능숙하지 않아서 해결책을 스스로 알아낼 수 없습니다.

도움을 주셔서 미리 감사드립니다!

편집: 출력의 모든 숫자는 %.5f 형식이어야 합니다.

답변1

모든 필드를 로 형식화하려면 다음을 %.5f사용할 수 있습니다 sprintf.

BEGIN {
    OFS = "\t"
}

NR == 1 {
    cols = split($0,m)
    next
}

NF == cols {
    for (i=1; i<=NF; i++)
        $i = sprintf("%.5f", $i/m[i])
}

1

$ awk -f above.awk file2 file1
1.00000 0.83333 0.60000
7.00000 2.33333 1.40000
1.00000 1.00000 1.00000

awk프로그램은 발생할 수 있는 오류에 대해 경고하지 않습니다. 당신은 시도 할 수 있습니다:

NR == 1 {
    cols = split($0,m)
    for (i in m)
        if (m[i] == 0)
            err("field "i" is "m[i]"; division by zero is fatal", 1)
    next
}

NF != cols {
    err("found "NF" fields, expected "cols)
    next
}

{
    for (i in m)
        $i = sprintf("%.5f", $i/m[i])
    print
}


END {
    exit errs
}

function err(msg, r) {

    # Print message to stderr
    # Leave non-zero exit status
    # Optionally go to END

    printf "%s - %s.\n", "error:  line "FNR" in "FILENAME, msg | "cat >&2"
    errs = 1
    if (r) exit
}

또한 각 필드가 숫자인지 확인하고 싶을 수도 있습니다.awk가 숫자가 아닌 경우 오류를 생성하도록 합니다.;awk 변수의 유형을 확인할 수 있나요?

답변2

안타깝게도 필요한 출력 형식에 대한 귀하의 질문이 명확하지 않습니다.

그러나 일반적으로 "표 형식 출력"을 보장하려면 결과를 다음으로 파이핑해 볼 수 있습니다 column.

awk 'BEGIN{CONVFMT="%.5f"} FNR==NR{split($0,div);next} NR>FNR{for (i=1;i<=NF;i++) $i=$i/div[i];}1' file2.txt file1.txt | column -t

이로 인해

1  0.83333  0.60000
7  2.33333  1.40000
1  1        1

제공한 입력 예시의 경우.

참고로, 파일 작업 시에는 (또는 등) cat을 사용할 필요가 없습니다 .awksed

고쳐 쓰다

귀하의 편집 내용을 보면 모든 숫자가 5자리 소수점 부동 소수점으로 표시된다는 것을 알 수 있습니다. 이 경우 @guest의 솔루션이 올바른 접근 방식이지만 column나중에 열 머리글을 인쇄하려는 경우에도 여전히 도움이 될 수 있습니다.

관련 정보