Ausgabe muss im CSV-Format formatiert werden

Ausgabe muss im CSV-Format formatiert werden

Dies ist die Datei abc.txt

NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"
NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"

Benötige eine Ausgabe im folgenden Format mit abc.csv

NAME    StartTime   TotalElapsedTime    Pool    ThreadsReached
MARK    14:11:26.710583     0       10      0
MARK    14:11:26.710583     0       10      0

Antwort1

Da das grundlegende CSV-Format Kommas ,als Feldtrennzeichen voraussetzt, verwenden Sie das folgende GNUsedAnsatz:

sed -e '1iNAME,StartTime,TotalElapsedTime,Pool,ThreadsReached' -e 's/[^=]*="\([^"]*\)"/\1,/g; s/,$//g' file

Die Ausgabe:

NAME,StartTime,TotalElapsedTime,Pool,ThreadsReached
MARK,14:11:26.710583,0,10,0
MARK,14:11:26.710583,0,10,0

1i- EinsätzeHeaderZeile vor der ersten Zeile der Datei

s/[^=]*="\([^"]*\)"/\1,/g- Extrahieren aller Attributwerte

Antwort2

while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift; N=$#
   for arg
   do
      set -- ${1+"$@"} "$(expr " $arg" : ' "\(.*\)"')"
   done
   shift "$N"; IFS=,; echo "$*"
done < abc.txt

while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift
   while case ${#} in 1 ) break ;; esac; do
      expr " $1" : ' "\(.*\)"'
      shift
   done | tr \\n ,; expr " $*" : '.*"\(.*\)"'
done < abc.txt

perl -lne '$,=",";
   print /(?:^|\h)\K[^=]*/g if $. == 1;
   print /="([^"]*)"/g;
' abc.txt

Erläuterungen

  • Im Perl-Code extrahieren wir aus der ersten Zeile die Feldnamen über den regulären Ausdruck, /(?:^|\h)\K[^=]*/gder als „gib mir die Folge von non=Zeichen, auf deren linker Seite sich entweder ein horizontales Leerzeichen \hoder ein Zeilenanfang befindet“ gelesen wird. Diese werden dann mit der Option „auf ein Komma setzen“ ^ausgegeben .OFS $,
  • Für alle Zeilen (auch die erste) extrahieren wir die Feldwerte über den regulären Ausdruck, /="([^"]*)"/gder wie folgt zu lesen ist: Extrahieren Sie die in Anführungszeichen eingeschlossene Zeichenfolge (Werte, die nicht maskiert sind), die links neben einem Gleichheitszeichen stehen. Die Sammlung dieser Werte wird dann stdoutmit dem verknüpft OFS.
  • Bei der whileSchleifenlösung lesen wir zunächst die Zeile so ein, wie sie ist, ohne Worttrennung. Dann setzen wir IFS auf =und lehnen das erste Feld ab. Jetzt haben alle Felder das Format. "..."...Anschließend verwenden wir das exprDienstprogramm, um den Wert in doppelte Anführungszeichen zu setzen und in das $@Array einzufügen. Am Ende der forSchleife entfernen wir die ursprünglichen Elemente ( $N), dann bleibt das übrig, was wir wollen. Schließlich werden sie durch Kommas miteinander verbunden, indem IFS auf Komma gesetzt und erweitert wird $*.

verwandte Informationen