awkを使用した出力の列の書式設定

awkを使用した出力の列の書式設定

9003行を含む次のデータセット名a.txtがあります。

571 43544000424023503222
572 43504442020202303202
573 40340440323043033204
574 40303445340343505242
...       ...

16078 50200000023322000202
16079 33233500320452300252
16080 04200330233532050502
16081 30200400323435434202

最初の列の値が右揃えになり、2番目の列のすべての行が同じフィールドで始まり、次のように最初の列と2番目の列の間にスペースがあるデータファイルをインポートしたいと思います。

  571 435440004240235032225
  572 435044420202023032022
  573 403404403230430332040
  574 403034453403435052423
...       ...

16078 502000000233220002021
16079 332335003204523002521
16080 042003302335320505023
16081 302004003234354342024

私はこのコードを試しています:

awk '{printf "%-5s \n", $1,$2}' a.txt |  # -5 indicate the maximum number of characters in the first column
expand > b.txt

2番目の列は正しい位置で始まりますが、最初の列は次のように出力で左揃えされます。

571   43544000424023503222
572   43504442020202303202
573   40340440323043033204
574   40303445340343505242
...       ...

16078 50200000023322000202
16079 33233500320452300252
16080 04200330233532050502
16081 30200400323435434202

この問題を解決するのに役立ちますか?

よろしくお願いします。

答え1

-フラグ(左揃え)は必要なく、デフォルトの並べ替えは右です。

awk '{printf "%5s %s\n",$1,$2}' a.txt

答え2

printf文字列長修飾子を使用して、文字列の形式を右揃えに指定できます。len最初のフィールドの前の間隔の長さ。

awk '{len=5-length($1); printf "%-*.*s %s %s\n", len,len," ",$1,$2}' a.txt

関連情報