CSVファイル内で1から9の間の1桁を2桁に変換

CSVファイル内で1から9の間の1桁を2桁に変換

このような何千もの行を含むCSVファイルがあります。

1664;4;5;35;37;43;5;6
1663;21;23;32;40;49;8;11
1662;16;17;34;35;44;5;10
1661;2;9;23;32;40;6;7
1660;23;25;30;44;47;9;12
1659;3;5;9;32;43;6;10
1658;4;6;10;13;34;3;5
1657;8;9;33;35;40;3;6
1656;15;20;31;44;48;1;3
1655;25;27;35;40;45;7;11
1654;7;32;33;34;38;6;9
1653;5;7;11;27;37;6;12
1652;7;31;33;35;36;7;10
1651;4;12;34;35;45;1;9
1650;5;8;29;35;48;5;6
1649;2;11;28;42;48;4;9
1648;2;11;12;19;38;4;8

1から9までの数字はすべて1桁の数字であることがわかります。

sedこの数字の前にゼロを追加して、この数字をどのように使用したり、2桁に変換したりできますか?

01 02 03 04 05 06 07 08 09

変える

1 2 3 4 5 6 7 8 9

よろしくお願いします。

ベストアンサー1

以下を使用するソリューションは次のとおりですawk

awk 'BEGIN{FS=OFS=";"} {for (i=1;i<=NF;i++) $i=sprintf("%02d",$i)} 1' file.csv

これにより、まず入力フィールドと出力フィールドの区切り文字がに設定されます;。その後、すべてのフィールドを繰り返し、次を使用しますsprintf()(ここでは効果的にフィールドの内容がすでに2桁の数字の場合は変更されません。

1アクションブロックの外側にあるように見えることは、awkすべての変更を含む現在の行を印刷するように指示します。

デフォルトでは、awkファイルは変更されずにのみ印刷されるため、stdout次のことができます。

  • 出力を一時ファイルにリダイレクトし、次のように名前を変更する必要があります。
    awk ' ... ' file.csv > output.csv && mv output.csv file.csv
    
  • または、拡張機能をawkサポートするバージョンを使用してください-i inplace
    awk -i inplace ' ... ' file.csv
    

また、この特別なケースは、1桁または2桁の数字のみを含む入力例に基づいてカスタマイズされています。nパディング番号のより一般的な場合は、次のものを使用できます。

awk -v n=3 'BEGIN{FS=OFS=";"} {for (i=1;i<=NF;i++) $i=sprintf("%0*d",n,$i)} 1' file.csv

おすすめ記事