awk druckt ein assoziatives Array mit OFS aus

awk druckt ein assoziatives Array mit OFS aus

Ich habe den folgenden awkCode. Er ermittelt zuerst die relevanten Feldnummern in der Kopfzeile und druckt dann die Ausgabe dieser Felder aus. Das Problem besteht darin, dass ich ein assoziatives Array verwende, um die relevanten Feldnummern zu speichern, und daher drucke ich in der forSchleife aus und verwende nicht , printsondern printf. Das Problem besteht darin, dass das Trennzeichen auch am Ende der Zeile hinzugefügt wird.

Gibt es eine einfache Möglichkeit, dies zu umgehen (ohnez.B(die Ausgabe noch einmal durchgehen und die zusätzlichen Trennzeichen entfernen)? Oder gibt es eine bessere Möglichkeit, die Felder auszudrucken, deren Nummern in einem Array gespeichert sind?

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

eine Testdatei sieht so aus

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

und meine Ausgabe sieht derzeit so aus

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

aber ich möchte, dass es so aussieht (dh, keine abschließenden Trennzeichen)

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

Antwort1

Ändern Sie Ihre printf()Anweisung, um das ,aus dem Formatbezeichner zu entfernen und es innerhalb des {..}Teils hinzuzufügen. Verwenden Sie einen ternären Operator, um das ,if not für das letzte Feld anzuhängen.

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

verwandte Informationen