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]","

おすすめ記事