次のような巨大なテキストファイルがあります。
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の答えとバッチ/パワーシェルソリューションが欲しいです。)興味深い答えがあります。
答え1
アッ近いスプリント機能機能(前に0を追加):
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
同じです。$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を使って行われた私の解決策です。 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