awk는 OFS를 사용하여 연관 배열을 인쇄합니다.

awk는 OFS를 사용하여 연관 배열을 인쇄합니다.

다음 awk코드가 있습니다. 먼저 머리글 행에서 관심 있는 필드 번호를 결정한 다음 해당 필드에 대한 출력을 인쇄합니다. 문제는 관심 있는 필드 번호를 유지하기 위해 연관 배열을 사용하고 있기 때문에 을 사용하는 대신 루프에서 이를 인쇄한다는 for것입니다. 문제는 줄 끝에 구분 기호도 추가한다는 것입니다.printprintf

이 문제를 해결할 수 있는 간단한 방법이 있습니까? (아니요.예를 들어출력을 다시 실행하고 추가 구분 기호를 제거하시겠습니까? 아니면 숫자가 배열에 저장된 필드를 인쇄하는 더 좋은 방법이 있습니까?

awk '
    BEGIN {
        FS = ","; OFS = ","
        no_headers = 2; headers[1] = "header1"; headers[2] = "header3"
        k = 0
    }

    NR==1 {
        for (i=1; i<=no_headers; i++) {
            for (j=1; j<=NF; j++) {
                s = gensub(/"/, "", "g", $j)
                if (s==headers[i]) { col_no[++k] = j }
            }
        }
    }

    NR>1 {
        for (i=1; i<=k; i++) { printf "%s,", $col_no[i] }
        print ""
    }' test_awk.txt

테스트 파일은 다음과 같습니다

"header1","header2","header3","header4"
"a","b","c",4
1,"b",,"d"
"a","2","c","d"

내 현재 출력은 다음과 같습니다

"a","c",
1,,
"a","c",

하지만 나는 이렇게 보이고 싶다(, 후행 구분 기호 없음)

"a","c"
1,
"a","c"

답변1

printf()형식 지정자를 제거하고 섹션 내에 추가하도록 문을 수정합니다 . 마지막 필드가 아닌 경우 삼항 연산자를 사용하여 추가하세요.,{..},

printf "%s", (i==k) ? $col_no[i] : $col_no[i]","

관련 정보