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()утверждение, чтобы удалить ,из спецификатора формата и добавить его внутрь {..}части. Используйте тернарный оператор, чтобы добавить ,if not для последнего поля

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

Связанный контент