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 $NF
dasselbe 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 -a
Flag 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 join
den 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