Ich habe den folgenden awk
Code. 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 for
Schleife aus und verwende nicht , print
sondern 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]","