Tcl

Tcl

Ich habe eine riesige Textdatei, die so aussieht:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12

Die gewünschte Ausgabe ist diese:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12

Ich habe es mit anderen relevanten Beiträgen hier und in anderen Communities versucht, konnte aber nicht genau das finden, was ich wollte.

AKTUALISIEREN

Dies ist dasKreuzfrage(Ich wollte sowohl Unix-/Perl-Antworten als auch Batch-/PowerShell-Lösungen hierfür.) Das hat interessante Antworten.

Antwort1

awkAnsatz mitsprintfFunktion (zum Hinzufügen führender Nullen):

awk -F, -v OFS=',' '$8=sprintf("MI-%02d",$8);' file

Die Ausgabe:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12

-F,- Komma ,als Feldtrenner setzen

$8- zeigt auf das achte Feld

%02d- Format, das Funktionsargumente behandelt als2-stellige Zahl


Notiz, das letzte Feld in einem Datensatz kann durch dargestellt werden $NF.

NFist eine vordefinierte Variable, deren Wert die Anzahl der Felder im aktuellen Datensatz ist

Das ist also $NFdasselbe wie $8(für Ihre Eingabe)

awk -F, -v OFS=',' '$(NF)=sprintf("MI-%02d", $(NF))' file

Antwort2

Sie können es mit Folgendem versuchen awk:

awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file

Antwort3

Hier ist die Perl-Lösung:

$ perl -F',' -lane '$last=$#F;$F[$last]=sprintf("MI-%02d",$F[$last]);print join ",", @F' input.txt                                       
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12

Mit diesem -aFlag können wir die Eingabe als Array behandeln, basierend auf dem mit angegebenen Trennzeichen -F. Grundsätzlich ändern wir das letzte Element in diesem Array und erstellen es über joinden Befehl neu.

Antwort4

Tcl

Hier ist meine Lösung, die mit Tcl erstellt wurde, das aus der Datei input.csv liest und das Ergebnis in die Datei output.csv einfügt

set in [open input.csv]
set out [open output.csv w]

while {![eof $in]} {
   set line [gets $in]
   set last_comma_pos [string last , $line]
   puts $out [string range $line 0 $last_comma_pos][format MI-%02d [string range $line $last_comma_pos+1 end]]
}

close $in
close $out

Demonstration

verwandte Informationen