Ein einfacher awk-Skript wie die folgenden sollte es tun:
awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv
Erläuterung:
awk -v find="10" -v field="5" -v newval="abcd"
: definiert drei Variablen für awk. find
, enthält das Muster, das wir suchen, field
, das die Nummer des Felds enthält, das wir bearbeiten möchten, und newval
mit dem zu ersetzenden Wert.
BEGIN {FS=OFS=","}
: Bevor wir die Datei durchlaufen, setzen wir den Dateitrenner und das Ausgabedateitrennzeichen auf ",".
if ($1 == find) $field=newval
: Wenn das 1rst Feld einer Zeile das Muster enthält, stellen wir wollen, setzen wir das N-te Feld (1. wenn $field=1
, 2. wenn $field=2
, ...) auf den Wert von newval
print $0
: was auch immer das Ergebnis von Beim if-Test drucken wir die ganze Zeile aus.
Eine kürzere (aber weniger verständlich) Version dieses Skript könnte wie folgt geschrieben werden:
awk -v a="10" -v f="5" -v n="abcd" -F, '$1 == a {$f=n}OFS=FS' test.csv
Wo a
auf find
bezieht, f
-field
verweist, n
-newval
und -F,
bezieht sich auf FS=","
Skript in Aktion:
> cat test.csv
11,05,nov,2016,122,2,2,330,user
10,05,nov,2016,123,2,2,330,user
12,05,nov,2016,124,2,2,330,user
> awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv
11,05,nov,2016,122,2,2,330,user
10,05,nov,2016,abcd,2,2,330,user
12,05,nov,2016,124,2,2,330,user
Bitte fügen Sie Ihre gewünschte Ausgabe für diese Beispieleingabe zu Ihrer Frage hinzu. – Cyrus
Willkommen bei Stack Overflow! Bitte [bearbeiten] Sie Ihre Frage, um [was Sie bisher versucht haben] (http://whathaveyoutried.com) zu zeigen. Sie sollten eine [mcve] des Codes einbeziehen, mit dem Sie Probleme haben, dann können wir versuchen, mit dem spezifischen Problem zu helfen. Sie sollten auch [fragen] lesen. –