各行の先頭に4つ未満の記号で欠落しているゼロを追加してください。

各行の先頭に4つ未満の記号で欠落しているゼロを追加してください。

この問題を解決する方法を尋ねたいと思います。単語が4文字未満のすべての行の前にゼロを追加する必要があります。

入力ファイルの例:

30
1
508
A0EA
A0EB
A0EC
A0ED

必要な出力は次のようになります。

0030
0001
0508
A0EA
A0EB
A0EC
A0ED

ご支援ありがとうございました。

答え1

すべての行に4つの前に0を追加してから、各行の最後の4文字を取得できます。

sed 's/^/0000/; s/^.*\(.\{4\}\)/\1/' < file

または、最初から4桁より広い数字を切らないでください。

sed 's/^/0000/; s/^.\{1,4\}\(.\{4\}\)/\1/' < file

答え2

ブレンドもあります:

$ numfmt --format='%04.0f' --invalid=ignore < file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

numfmtGNU Coreutils パッケージで提供されます。

答え3

入力が16進数の場合は、strtonum()にGNU awkを使用してください。

$ awk '{printf "%04X\n", strtonum("0x"$0)}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

入力が16進数であるかどうかにかかわらず、GNU awkを使用してください。

$ awk '{print gensub(/ /,0,"g",sprintf("%4s",$0))}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

awkの場合、入力が16進数であるかどうかにかかわらず、次のことを行います。

$ awk '{v=sprintf("%4s",$0); gsub(/ /,0,v); print v}' file
0030
0001
0508
A0EA
A0EB
A0EC

でも:

$ awk '{$0=sprintf("%4s",$0); gsub(/ /,0)} 1' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

答え4

zshシェルの場合は、l:length::string:左側のパディング引数を使用してフラグを拡張できます。

$ var=FF
$ echo ${(l:4::0:)var}
00FF

ファイル内のすべての単語に適用するには:

printf '%s\n' ${(l:4::0:)$(<file)}

この演算子も参照してください。カット4文字を超える単語です。

関連情報