
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[^=]*/g
der als „gib mir die Folge vonnon=
Zeichen, auf deren linker Seite sich entweder ein horizontales Leerzeichen\h
oder 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,
/="([^"]*)"/g
der 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 dannstdout
mit dem verknüpftOFS
. - Bei der
while
Schleifenlö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 dasexpr
Dienstprogramm, um den Wert in doppelte Anführungszeichen zu setzen und in das$@
Array einzufügen. Am Ende derfor
Schleife 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$*
.