So verwenden Sie awk oder sed, um CSV-Diffs in ein besser lesbares Format zu konvertieren

So verwenden Sie awk oder sed, um CSV-Diffs in ein besser lesbares Format zu konvertieren

Kann mir jemand ein Beispiel geben, wie man mit awk oder sed (ich bin nicht sicher, welches von beiden, da ich beide nicht oft verwendet habe, da ich hauptsächlich grep und cut zum Arbeiten mit CSV-Daten verwendet habe) Unterschiede zwischen zwei CSV-Dateien in etwas besser Lesbares umwandelt.

z. B. wenn ich einen Diff aus alten und neuen CSV-Dateien generiert habe, was im wirklichen Leben aufgrund der großen Anzahl an Spalten viel komplexer sein könnte:

2,3c2,3
< Barbara,1093,19
< Magdaline,2093,20
\ No newline at end of file
---
> Barbara,1011,19
> Magdaline,12093,20
\ No newline at end of file

wie kann ich es in dieses Format konvertieren:

Barbara  1093 1011 
Magdaline 2093 12093

in einem neuen Format – eine erste Datenspalte ist ein Wert aus der ersten Spalte in beiden Teilen des Diffs, um die Zeile zu identifizieren. Die zweite Spalte enthält die Daten aus der ersten CSV-Datei (alter Wert) und die dritte Spalte – ist der Wert aus der zweiten CSV-Datei (neuer Wert).

Wie kann ich eine solche Textkonvertierung über awk oder sed durchführen?

Danke schön.

Antwort1

Verwenden Sie awk mit zwei assoziativen Arrays. Etwa so:

awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
'

Wenn Sie möchten, können Sie das alles zu einer durch Leerzeichen getrennten Einzeiler zusammenfassen – ich bevorzuge jedoch mehrere Zeilen. ;) Hier ein Beispiel:

sauer@humpy:~$ cat file
< a,b,c
> a,d,e
gibberish
< 1,2,3
> 1,4,5
sauer@humpy:~$ awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
' < file
a b d
1 2 4

Oh, wenn Sie ein altes Awk haben, "< *"muss das möglicherweise ein festes Muster und kein regulärer Ausdruck sein, also lassen Sie das weg *und fügen Sie die wörtliche Anzahl von Leerzeichen nach dem Richtungsanzeiger ein.

verwandte Informationen