staging.inyokaproject.org

CSV - Lösche Wert in Spalte 2 wenn Wert x in Spalte 1

Status: Gelöst | Ubuntu-Version: Server 22.10 (Kinetic Kudu)
Antworten |

rurotil

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Hallo Leute,

wie könnte ich meine Tablle mit sed oder awk so umstellen? Immer wenn vorne die Sequenz wechselt, soll die partner_id und die Zahlungsbedingungen gelöscht werden.

IST Zustand:

sequence	partner_id		order	uom_qt 	Zahlungsbedinungen
1			10238			7000427	2		14 Tage
1			10238			7030321	1		14 Tage
1			10238			7030322	3		14 Tage
1			10238			7000094	1		14 Tage
2			10200			7030192	1		14 Tage
3			10283			7000428	1		14 Tage
3			10283			7030215	2		14 Tage
4			10399			7000456	2		14 Tage
4			10399			7000457	6		14 Tage
5			10443			7000456	3		14 Tage
5			10443			7000457	3		14 Tage

SOLL Zustand:

sequence	partner_id		order	uom_qt 	Zahlungsbedinungen
1			10238			7000427	2		14 Tage
1						7030321	1		
1						7030322	3		
1						7000094	1		
2			10200			7030192	1		14 Tage
3			10283			7000428	1		14 Tage
3						7030215	2		
4			10399			7000456	2		14 Tage
4						7000457	6		 
5			10443			7000456	3		14 Tage
5						7000457	3	

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

rurotil schrieb:

Immer wenn vorne die Sequenz wechselt, soll die partner_id und die Zahlungsbedingungen gelöscht werden.

Ich glaube Du wolltest sagen "Immer wenn vorne die Sequenz gleich bleibt, soll die partner_id und die Zahlungsbedingungen gelöscht werden."

Ein Ansatz, der aber leider die Formatierung zerlegt. Außerdem ist das Problem, dass die letzte Spalte Whitespace beinhaltet. Aber vielleicht hilft Dir das ja eine Lösung zu finden.

1
awk '$1==last {$2=$5=$6=""}  {print;last=$1}' data

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 611

Ich denke, dass du in deinen "IST Zustand" Daten ein paar TABs zu viel gesetzt hast. Wenn man diese per "tr -s" bereinigt und die awk Zeile von rklm ein wenig erweitert, bekommst du das gewünschte Ergebnis:

$ cat daten | tr -s "\t" | awk -F"\t" 'BEGIN{OFS=FS} $1==last {$2=$5=""}  {print;last=$1}' | column -t -o"|" -s$'\t'
sequence|partner_id|order  |uom_qt |Zahlungsbedinungen|
1       |10238     |7000427|2      |14 Tage           |
1       |          |7030321|1      |                  |
1       |          |7030322|3      |                  |
1       |          |7000094|1      |                  |
2       |10200     |7030192|1      |14 Tage           |
3       |10283     |7000428|1      |14 Tage           |
3       |          |7030215|2      |                  |
4       |10399     |7000456|2      |14 Tage           |
4       |          |7000457|6      |                  |
5       |10443     |7000456|3      |14 Tage           |
5       |          |7000457|3      |                  |
$

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Sorry ich hatte vergessen zu erwähnen, das die Datei so nur zur Darstellung dient. Ich habe als Teiler ";"

Hatte daher das gerade so versucht:

cat preisliste01.csv | tr -s ";" | awk -F";" 'BEGIN{OFS=FS} $1==last {$2=$5=""}  {print;last=$1}' | column -t -o"|" -s$';' > preisliste02.csv

Das funktioniert dann aber nicht. Übersehe ich nun etwas?

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 611

rurotil schrieb:

Das funktioniert dann aber nicht. Übersehe ich nun etwas?

Sorry, dass ich dich mit dem "column" wohl etwas verwirrt habe. Das TAB Teichen kann man in der Regel über "\t" eingeben. Bei "column" wird das beim Parameter "-s" anders interpretiert, weshalb ich das Zeichen als $'\t' oder $'\x09' oder $'\011' eingegeben haben. Da du als Trennzeichen nun ";" verwenden willst, sollte besser column -t -s";" -o"|" verwendet werden. Somit solltest du deinen Befehl wie folgt vereinfachen:

$ echo "sequence;partner_id;order;uom_qt ;Zahlungsbedinungen
1;10238;7000427;2;14 Tage
1;;7030321;1;
1;;7030322;3;
1;;7000094;1;
2;10200;7030192;1;14 Tage
3;10283;7000428;1;14 Tage
3;;7030215;2;
4;10399;7000456;2;14 Tage
4;;7000457;6;
5;10443;7000456;3;14 Tage
5;;7000457;3;
" | awk -F";" 'BEGIN{OFS=FS} $1==last {$2=$5=""}  {print;last=$1}' 
sequence;partner_id;order;uom_qt ;Zahlungsbedinungen
1;10238;7000427;2;14 Tage
1;;7030321;1;
1;;7030322;3;
1;;7000094;1;
2;10200;7030192;1;14 Tage
3;10283;7000428;1;14 Tage
3;;7030215;2;
4;10399;7000456;2;14 Tage
4;;7000457;6;
5;10443;7000456;3;14 Tage
5;;7000457;3;
$

oder auch

awk -F";" 'BEGIN{OFS=FS} $1==last {$2=$5=""}  {print;last=$1}' input.csv >output.csv

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

vielen Dank ☺ Hat super funktioniert

awk -F";" 'BEGIN{OFS=FS} $1==last {$2=$6=""}  {print;last=$1}' input.csv >output.csv

aus der 5 musste ich noch eine 6 machen, aber dann war es perfekt ☺ Danke

Antworten |