Tcl

Tcl

次のような巨大なテキスト ファイルがあります。

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

望ましい出力は次のとおりです。

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

ここで、また他のコミュニティで他の関連する投稿を試してみましたが、私が望むものを正確に得ることができませんでした。

アップデート

これは反対質問(これについては、Unix/perl の回答とバッチ/powershell のソリューションの両方が必要でした。) 興味深い回答があります。

答え1

awkアプローチスプリント関数(先頭にゼロを追加する):

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

出力:

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,-,フィールド区切りとしてカンマを設定する

$8- 8番目のフィールドを指す

%02d- 関数の引数を次のように扱う形式2桁の数字


注記レコードの最後のフィールドは で表すことができます$NF

NF現在のレコード内のフィールドの数を表す定義済み変数です。

つまり、(あなたの入力に対して)$NFと同じです$8

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

答え2

以下を使用してみてくださいawk:

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

答え3

Perl のソリューションは次のとおりです。

$ 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

この-aフラグを使用すると、 で指定された区切り記号に基づいて、入力を配列として扱うことができます-F。基本的に、その配列の最後の項目を変更し、コマンドを使用して再構築しますjoin

答え4

Tcl

これが私の解決策です。Tclを使用してinput.csvファイルから読み取り、結果をoutput.csvファイルに格納します。

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

デモンストレーション

関連情報