oiooiooioiioooiioiioiooo
Goto Top

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.

grep "^\([^ ][^ ]*  *\)\{1\}$SUCHWERT" "netzwerk/CONFIG/guthaben.csv" | cut -d ' ' -f8  

Vielen Dank für Eure Hilfe.

@OIOOIOOIOIIOOOIIOIIOIOOO

Content-Key: 549717

Url: https://administrator.de/contentid/549717

Printed on: April 19, 2024 at 11:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Feb 20, 2020 at 13:47:29 (UTC)
Goto Top
Moin,

Hast Du denn auch ein paar Beispielzeilien mit "vorher/nachher"?

schau Dir mal awk und sed an.

lks
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 20, 2020 at 13:53:47 (UTC)
Goto Top
Guten Tag @Lochkartenstanzer,

ja bei awk und sed bin ich stecken geblieben, aber ich komme da kein Meter voran, kann scheinbar überhaupt nicht mehr unter Zeitdruck arbeiten... face-sad

In Prinzip soll es wie eine normale Datenbank abfrage funktionieren, als würde man eine E-Mail Adresse bei zum Beispiel eBay ändern wollen.

Also:

vorher:
SPALTE1 SUCHERT SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 WERTÄNDERN
SPALTE1 32123123 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 100000
SPALTE1 32123124 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 200000
SPALTE1 32123125 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 500000

Jetzt soll aus der Spalte 2 der Wert 32123124 gesucht werden und davon die Spalte 8 von 200000 auf 3AD2 geändert werden.

SPALTE1 SUCHERT SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 WERTÄNDERN
SPALTE1 32123123 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 100000
SPALTE1 32123124 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 3AD2
SPALTE1 32123125 SPALTE3 SPALTE4 SPALTE5 SPALTE6 SPALTE7 500000

Vielen Dank

@OIOOIOOIOIIOOOIIOIIOIOOO
Mitglied: 143127
143127 Feb 20, 2020 updated at 14:04:20 (UTC)
Goto Top
Auf die schnelle nen awk Einzeiler
awk '{if($2 == "32123124"){print $1,$2,$3,$4,$5,$6,$7,"3AD2"}else{print $0}}' test.txt >testneu.txt  
sed geht natürlich auch, aber mit Regex wollte ich dich jetzt in deinem Zustand nicht auch noch überfordern face-wink.
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 20, 2020 at 14:37:14 (UTC)
Goto Top
Guten Tag @143127,

vielen Dank für deine schnelle Hilfe.

Jetzt hast du mich neugierig gemacht.

https://www.tutorialspoint.com/unix/unix-regular-expressions.htm

In ruhige Minute werde ich mich mal belesen.

Jetzt muss ich nur noch einen logischen Fehler in meine Kette suchen und beseitigen.

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 20, 2020 updated at 15:17:08 (UTC)
Goto Top
Verzeihung @143127,

ich noch einmal.

Die zuvor von dir eingegebene Variante war für die Konsole zum testen ok. Aber, was mache ich wenn die 3AD2 aus eine Variable kommt?

awk '{if($2 == "$SUCHWERT"){print $1" "$2" "$3" "$4" "$5" "$6" "$7" $NEUERWERT"}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?

Derzeit sehe ich es nur mit 'mv' zu lösen.

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Mitglied: 143127
Solution 143127 Feb 20, 2020 updated at 16:02:08 (UTC)
Goto Top
Man müsste sich nur mal die Kommandozeilenoptionen ansehen ...

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 Katzensprung
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 -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  
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 20, 2020 updated at 16:08:33 (UTC)
Goto Top
Vielen Dank @143127!

gawk -i inplace -v var1="$SUCHWERT" -v var2="$NEUEWERT" '{if($2 == var1){print $1,$2,$3,$4,$5,$6,$7,var2}else{print $0}}' netzwerk/CONFIG/guthaben.mal  

Da hätte ich mit "try and error" Methode das nie geschafft.

awk versteht leider kein -i somit musste ich das gawk installieren.

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Mitglied: 143127
143127 Feb 20, 2020 updated at 16:27:36 (UTC)
Goto Top
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.
https://groups.google.com/forum/#!topic/comp.lang.awk/QM51VPAlw4I
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 20, 2020 at 17:06:06 (UTC)
Goto Top
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)
Und es hat mir das ausgegeben: awk: not an option: -i
Mitglied: 143127
143127 Feb 20, 2020 updated at 17:14:51 (UTC)
Goto Top
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.
Member: Lochkartenstanzer
Lochkartenstanzer Feb 20, 2020 at 17:14:00 (UTC)
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:

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)
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
Mitglied: 143127
143127 Feb 20, 2020 updated at 17:20:50 (UTC)
Goto Top
Gerade mal nachgesehen. Die Funktion steckt in der Library inplace.so in /lib/gawk. Ist sie dort nicht vorhanden klappt auch inplace als Wert des Parameters -i nicht auch wenn die Version es eigentlich supporten würde.

screenshot
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 21, 2020 at 08:31:54 (UTC)
Goto Top
Guten Tag,

bin derzeit an dem "Raspbian GNU/Linux 10 (buster)" dran.

Und den Ordner /lib/gawk oder awk kann nicht nicht finden.

face-sad

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO Feb 21, 2020 at 10:09:50 (UTC)
Goto Top
Eine Frage habe ich noch zur diese Zeile.

-v
Ansage zur Variable
$2 == var1
Suche nach dem Wert welches in der Variable zwei angegeben ist.
print $1,$2,$3,.....
Ausgabe wenn die Variable in eine Zeile gefunden wurde.
print 0
ignorieren wenn der Wert in der Spalte zwei nicht gefunden wurde

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?

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Mitglied: 143127
143127 Feb 21, 2020 updated at 10:22:36 (UTC)
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:
-v
Ansage zur Variable
OK.


$2 == var1
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

print $1,$2,$3,.....
Ausgabe wenn die Variable in eine Zeile gefunden wurde.
Ausgabe der Spalten die $x sind Variablen die awk automatisch anlegt

print 0
ignorieren wenn der Wert in der Spalte zwei nicht gefunden wurde
$0 enthält in AWK immer die ganze Zeile.

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}'