staging.inyokaproject.org

awk - Feld finden und in Folgezeile anfügen

Status: Gelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

dafosy

Anmeldungsdatum:
26. Februar 2012

Beiträge: Zähle...

Hallo Community,

ich habe eine CSV-tabelle (siehe Anhang tabelle_orig.png)

Ziel soll sein, dass mittels eines awk-Skriptes eine neue Tabelle generiert wird, welche den Text eines Datums der Zeile kopiert und in der Folgezeile an den Inhalt anhängt, bzw. einfügt, wenn in der Folgezeile keine Text steht. (siehe Anhang tabelle_ziel.png)

Aktuell komme ich nur bis hierher...

awk '/18.01.2023/ { line=$0 } line!="" { $0=$0"\n"line"\n"$0;line=""}1' Projekt-2.csv > test-01.csv

Grüße dafosy

Bilder

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: Zähle...

Meine Logik ist aktuell, dass ich nach awk per Schleife das Datum hochzählen lasse.

Es könnte natürlich auch mit sed gehen, aber mittlerweile habe ich einen Knoten im Kopf.

Gruß

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: Zähle...

Also quasi:

Wenn Feld $2 nicht leer ist, kopiere den Inhalt in nachfolgender Zeile in Feld $3. Füge dann Feld $6 an Inhalt des Feldes $2. Wenn Feld $3 nicht leer ist, füge Inhalt des Feldes $7 an $3. Springe in nächste Zeile und mache das gleiche.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Am besten hängst Du ein Beispiel-CSV an. Bilder bringen da nix.

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: Zähle...

Ich habe heute auch noch weiter dran geknobelt, morgen stelle ich mal noch eine CSV mit ein.

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: Zähle...

Ich stelle das Thema mal auf gelöst.

Ich habe mir für die Verwendung von Gammu (SMS-Verteiler) etwas gebaut, was aktuell sehr gut funktioniert. Folgende Logik: Ein Bash-Skript baut mir aus CSV-Daten einfach ein neues BASH-Skript zusammen, welches sich dann ausführt.

(1) Schritt - Text-Schnipsel generieren Dafür verwende ich als Basis eine umfangreiche Excel-Tabelle, die mir praktisch alle Textbausteine generiert und ich dort auch meine Ausgangsdaten regelmäßig einpflegen kann.

(2) Zusammenbau für die Übergabe am Gammu Dafür verwende ich nun ein bash-Skript, welches mittels awk das aktuelle Datum verwendet, um in der übergebenen CSV den entsprechenden Eintrag zu ermitteln und auszugeben:

echo -n "gammu sendsms TEXT " 
# Telefonnummer
text01=$(awk -F '[;]' -v date=$(date +%d.%m.%Y) '$5~date {print $12 }' $file)
echo -n $text01 
echo -n " -text '" 
# Ort ... SMS-Text
text02=$(awk -F '[;]' -v date=$(date +%d.%m.%Y) '$5~date {print $11 }' $file)
echo -n $text02 
echo -n " "
# Tonnen zurückstellen
text03=$(awk -F '[;]' -v date=$(date +%d.%m.%Y) '$5~date {print $8 }' $file)
echo -n $text03 
# Leerzeichen
echo -n " "
# Tonnen raus stellen
text04=$(awk -F '[;]' -v date=$(date +%d.%m.%Y) '$5~date {print $9 }' $file) 
echo -n $text04 
echo "'"

(3) weitere Verwertung dann mit gammu.

Soweit gelöst. Grüße und Danke für die Anregungen.

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Das Problem in deiner Anfrage ist, was unter YYY und ZZZ zu verstehen ist. Ich bin mal von folgender Datei ausgegangen:

$ cat tabelle_orig.csv 
04.01.2023;Text-A;;;;YYY1;ZZZ1
05.01.2023;Text-B;;;;YYY2;ZZZ2
06.01.2023;;;;;;
09.01.2023;Text-C;;;;YYY3;ZZZ3
10.01.2023;Text-D;;;;YYY4;ZZZ4
11.01.2023;Text-E;;;;YYY5;ZZZ5
12.01.2023;;;;;;
13.01.2023;;;;;;
$

Mit dem folgenden awk erhältst du dann die folgende Ausgabe:

$ cat tabelle_orig.csv | awk -F";" 'BEGIN{o2="";o7="";OFS=FS}{if($2==""){$3=o2" "o7;o2="";o7=""}else{if(o2!=""){$3=o2" "$7}o2=$2;o7=$7;$2=o2" "$6};print $0}'
04.01.2023;Text-A YYY1;;;;YYY1;ZZZ1
05.01.2023;Text-B YYY2;Text-A ZZZ2;;;YYY2;ZZZ2
06.01.2023;;Text-B ZZZ2;;;;
09.01.2023;Text-C YYY3;;;;YYY3;ZZZ3
10.01.2023;Text-D YYY4;Text-C ZZZ4;;;YYY4;ZZZ4
11.01.2023;Text-E YYY5;Text-D ZZZ5;;;YYY5;ZZZ5
12.01.2023;;Text-E ZZZ5;;;;
13.01.2023;; ;;;;
$ # oder etwas schöner formatiert:
$ cat tabelle_orig.csv | awk -F";" 'BEGIN{o2="";o7="";OFS=FS}{if($2==""){$3=o2" "o7;o2="";o7=""}else{if(o2!=""){$3=o2" "$7}o2=$2;o7=$7;$2=o2" "$6};print $0}' | column -t -s ";"
04.01.2023  Text-A YYY1                   YYY1  ZZZ1
05.01.2023  Text-B YYY2  Text-A ZZZ2      YYY2  ZZZ2
06.01.2023               Text-B ZZZ2            
09.01.2023  Text-C YYY3                   YYY3  ZZZ3
10.01.2023  Text-D YYY4  Text-C ZZZ4      YYY4  ZZZ4
11.01.2023  Text-E YYY5  Text-D ZZZ5      YYY5  ZZZ5
12.01.2023               Text-E ZZZ5            
13.01.2023                              
$

Oops: Da habe ich wohl zu lange gebraucht, um den Text einzutippen. Es waren schon mehrere Antworten da.

Antworten |