このような何千もの行を含む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