Wert aus eine bestimmte Zeile in eine andere Spalte ändern unter Linux Bash
Guten Tag,
ich sitze gerade wiedermal vor einem Problem und muss unter Zeitdruck ein diesen lösen.
Ich muss mit eine Zeile mit Bash, und dass sollte ja möglich sein in eine Datei welche Werte mit Leerzeichen getrennt sind nach eine bestimmte Zeile aus dem Wert der zweiten Spalte suchen und den Wert in der achten Spalte ändern.
Mit der nachfolgenden Zeile, kann ich den aktuellen Wert ausgeben, wie ich diesen jetzt jedoch ändern kann, bleibt mir leider noch offen.
Vielen Dank für Eure Hilfe.
@OIOOIOOIOIIOOOIIOIIOIOOO
ich sitze gerade wiedermal vor einem Problem und muss unter Zeitdruck ein diesen lösen.
Ich muss mit eine Zeile mit Bash, und dass sollte ja möglich sein in eine Datei welche Werte mit Leerzeichen getrennt sind nach eine bestimmte Zeile aus dem Wert der zweiten Spalte suchen und den Wert in der achten Spalte ändern.
Mit der nachfolgenden Zeile, kann ich den aktuellen Wert ausgeben, wie ich diesen jetzt jedoch ändern kann, bleibt mir leider noch offen.
grep "^\([^ ][^ ]* *\)\{1\}$SUCHWERT" "netzwerk/CONFIG/guthaben.csv" | cut -d ' ' -f8
Vielen Dank für Eure Hilfe.
@OIOOIOOIOIIOOOIIOIIOIOOO
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 549717
Url: https://administrator.de/contentid/549717
Ausgedruckt am: 21.11.2024 um 23:11 Uhr
15 Kommentare
Neuester Kommentar
Auf die schnelle nen awk Einzeiler
sed geht natürlich auch, aber mit Regex wollte ich dich jetzt in deinem Zustand nicht auch noch überfordern .
awk '{if($2 == "32123124"){print $1,$2,$3,$4,$5,$6,$7,"3AD2"}else{print $0}}' test.txt >testneu.txt
Man müsste sich nur mal die Kommandozeilenoptionen ansehen ...
https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inpl ...
https://stackoverflow.com/questions/16529716/save-modifications-in-place ...
Also zusammengefasst dann so
awk -v var1="$SUCHWERT" -v var2="$NEUERWERT" '{if($2 == var1){print $1,$2,$3,$4,$5,$6,$7,var2}else{print $0}}' netzwerk/CONFIG/guthaben.mal >netzwerk/CONFIG/guthaben.test
Gibt es denn nicht eine Möglichkeit mit AKW in die gleiche Datei zu schreiben?
Ja, auch das ist nur einen Katzensprunghttps://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inpl ...
https://stackoverflow.com/questions/16529716/save-modifications-in-place ...
Also zusammengefasst dann so
awk -i inplace -v var1="$SUCHWERT" -v var2="$NEUERWERT" '{if($2 == var1){print $1,$2,$3,$4,$5,$6,$7,var2}else{print $0}}' netzwerk/CONFIG/guthaben.mal
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:
awk versteht leider kein -i somit musste ich das gawk installieren.
Doch tut es, aber nur das aktuelle seit Version GNU Awk 4.1.0 siehe Hinweis im Link.awk versteht leider kein -i somit musste ich das gawk installieren.
https://groups.google.com/forum/#!topic/comp.lang.awk/QM51VPAlw4I
Dann hast du wohl eine ohne das Feature kompilierte Variante, bzw. die Libray dafür fehlt auf deinem System. Die Standardvarianten diverser Distros beinhalten das Feature jedenfalls. Liegt wohl daran das deine verwendete Distro die Library nicht beinhaltet.
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:
Und es hat mir das ausgegeben: awk: not an option: -i
Zitat von @143127:
Doch tut es, aber nur das aktuelle seit Version GNU Awk 4.1.0 siehe Hinweis im Link.
https://groups.google.com/forum/#!topic/comp.lang.awk/QM51VPAlw4I
Also ich hab hier GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)Doch tut es, aber nur das aktuelle seit Version GNU Awk 4.1.0 siehe Hinweis im Link.
https://groups.google.com/forum/#!topic/comp.lang.awk/QM51VPAlw4I
Und es hat mir das ausgegeben: awk: not an option: -i
Bei mir mit
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
ist die Option dabei. Ich tippe auch mal, daß bei Dir die Option nicht mit ins binary gepackt wurde. Mit welcher Distribution arbeitest Du denn?
lks
OK.
Suche nach dem Wert welches in der Variable zwei angegeben ist.
Nein $2 ist der Inhalt der zweiten Spalte und var1 der Inhalt der Variablen 1 die übergeben wurde
Ausgabe wenn die Variable in eine Zeile gefunden wurde.
Ausgabe der Spalten die $x sind Variablen die awk automatisch anlegt
ignorieren wenn der Wert in der Spalte zwei nicht gefunden wurde
$0 enthält in AWK immer die ganze Zeile.
-F ';'
Im String für den Delimiter nutzt man Regex-Syntax also Achtung.
Beispiel
$2 == var1
print $1,$2,$3,.....
print 0
Was ich aber nicht verstehe ist, an welche Stelle genau erkennt awk welches Trennzeichen für Spalte verwendet wird? Was macht man, wenn ein Trennzeichen zum Beispiel ; oder Tab ist?
Spaces und Tabs sind Standardmäßig ein Delimiter von AWK deswegen habe ich den nicht angegeben, wenn du einen anderen angeben willst machst du das mit Dem Parameter -F (steht für Field Delimiter)-F ';'
Im String für den Delimiter nutzt man Regex-Syntax also Achtung.
Beispiel
echo "Test;Test2;Test3" | awk -F ';' '{print $2}'