2016-11-16 2 views
-2

ich eine .txt habe, die beispielsweise durch getrennte Linien und diese wiederum Daten enthält „“:in bash in einer .txt-Datei Zeile ändern

10,05,nov,2016,122,2,2,330,user 

Was ich will, ist in der Lage sein, ein zu modifizieren Parameter einer X-Zeile, bei der die Suchmethode die erste Nummer ist, die eindeutig ist, wird nicht wiederholt. Suchen Sie zum Beispiel die Nummer 10 (f1) und ändern Sie die Zeile mit der 122 (f5). Ich habe es mit sed versucht, aber ich kann es nicht tun. Ich habe das mit awk kommentiert, aber ich habe diesen Befehl nicht studiert. Einige helfen ??

+0

Bitte fügen Sie Ihre gewünschte Ausgabe für diese Beispieleingabe zu Ihrer Frage hinzu. – Cyrus

+0

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. –

Antwort

1

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 
0

Mit sed:

$ sed '/^10/s/,[^,]*/,333/4' <<< "10,05,nov,2016,122,2,2,330,user" 
10,05,nov,2016,333,2,2,330,user 

In den Zeilen mit 10 beginnen, für die 4. Komma durch nicht-Komma Zeichen folgen suchen und mit Ihrem -Ersatzzeichenfolge ersetzen.

Verwandte Themen