web-dev-qa-db-ja.com

テキストファイルの特定のフィールドをゼロパッドするにはどうすればよいですか?

私はこのようなファイルを持っています:

123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr

結果を出すために、中央のフィールドをゼロで埋めたいと思います。

123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr

これを実行するスクリプトを作成するにはどうすればよいですか?

私はこのような例を見てきました

awk '{ $6=sprintf("%06s", $6); print $0}'

しかし、私はそれを本当に理解していないので、それを機能させることができません。

4
mattm123

これを試して:

awk -F , '{ printf "%i,%08i,%s\n" , $1 , $2 , $3 }' file
8
cYrus

質問に_[sed]_のタグを付けたので、これがスクリプトに基づくsedバージョンです ここ

_sed 's/[^,][^,]*/\n0000000&/2;s/\n[^,]*\(.\{8\}\),/\1,/' inputfile
_

説明:

  • フィールドは、1つ以上の非コンマのグループで構成されます:_[^,][^,]*_(これは_[^,]\+_
  • 2番目のフィールドの代わりに(一致)(_s///2_)改行、ゼロの束、および一致の内容:_\n0000000&_(改行は次のステップのフィールドの開始をマークするために使用されます)
  • 改行、0個以上の非コンマ、および任意の文字の正確に8個_\{8\}_に一致するようになりました(これらの文字をキャプチャします\(\))の後にコンマが続く
  • キャプチャされた文字_\1_を一致に置き換えます。これにより、一時的な改行と余分なゼロが削除されます。

これが機能する方法は、フィールドの先頭に余分なゼロを追加してから、フィールド以外のすべてを切り落とすことです。

あなたの質問のコマンドは正しいですが、更新が必要です。

awk '{ $6=sprintf("%0.8s", $6); print $0}'

また、出力フィールドセパレータの使用を変更するには:

awk '{ OFS="\xE7"; $6=sprintf("%0.8s", $6); print $0}'

0
Harshal Zope