So ersetzen Sie die N-te Spalte/Feld in einer Komma-separierten string mit sed/awk?
angenommen ich habe einen string
"1,2,3,4"
Nun möchte ich ersetzen, z.B. das 3. Feld von die Zeichenfolge, die durch einige verschiedenen Wert.
"1,2,NEW,4"
Ich es geschafft, tun Sie dies mit dem folgenden Befehl:
echo "1,2,3,4" | awk -F, -v OFS=, '{$3="NEW"; print }'
Nun den index für die Spalte ersetzt werden sollten, werden als variable weitergegeben. Also in diesem Fall
index=3
Wie kann ich diese übergeben zu awk? Da dies nicht funktioniert:
echo "1,2,3,4" | awk -F, -v OFS=, '{$index="NEW"; print }'
echo "1,2,3,4" | awk -F, -v OFS=, '{$($index)="NEW"; print }'
echo "1,2,3,4" | awk -F, -v OFS=, '{\$$index="NEW"; print }'
Vielen Dank für Ihre Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben die shell-interpolieren der index in das awk-Programm:
Beachten Sie, wie die ursprünglich einzelnen zitiert awk Programm ist geteilt in drei Teile, eine single quoted Anfang '{$', die interpolierten Wert des index, gefolgt von der single quoted Rest des Programms.
-v var=value
zu definieren, die eine variable in awk durch seine Befehlszeile, und verwenden Sie dann$var
. Also dieser text-substitution-hack ist nicht erforderlich.Könnte dies für Sie arbeiten:
oder:
Hier ein
sed
uctive Weg zu brechen dieawk
wardness:Dies ist leicht erweiterbar, um mehrere Indizes, die nur durch das hinzufügen eines weiteren
-e $newindex's/.*/NEWNEW/'
sed
Linien separat behandelt jetzt, nicht im ganzen text. Angeschaut am die Antwort, schlage ich vor, umleiten der Ausgabe zupaste -sd ','
wie diese:echo "1,2,3,4" | sed 's/,/\n/g' | sed -e $index's/.*/NEW/' | paste -sd ','
.Mit einfachen awk (I. E. Nicht glotzen etc) ich glaube, du wirst
split( string, array, [fieldsep] );
ändern der array-Eintrag der Wahl und dann kommen Sie zurück zusammen mitsprintf
oder ähnliches in einer Schleife.gawk erlaubt es Ihnen, eine variable als Feldname, $index in deinem Beispiel. Sehen hier.
gawk ist in der Regel der Standard awk in Linux, so ändern Sie Ihren Aufruf zu gawk "- Skript" und sehen, ob es funktioniert.