フィールドの長さに応じて末尾のスペースを追加する方法

フィールドの長さに応じて末尾のスペースを追加する方法

各フィールドに末尾のスペースを追加したいと思います。私のファイルは次のとおりです。

入力ファイル:

A|B|C|D

出力ファイルのフィールド1の長さは次のとおりです。1

出力ファイルのフィールド2の長さは次のとおりです。3

出力ファイルのフィールド3の長さは次のとおりです。4

出力ファイルのフィールド 4 の長さは次のとおりです。6

希望の出力:

AB  C   D  

シェルでこれを達成する方法は?助けてください

ベストアンサー1

そしてawk

awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}' < input > output

正しいスペースの塗りつぶしとトリミングを行います。

awk実装に応じて、長さはバイト単位または文字単位です(マルチバイト文字の場合は異なります)。いずれにしても、これらの文字の表示幅に基づいていません(たとえば、二重幅または幅が0の文字または端末の表示幅が1以外のTAB)。

例:

$ echo 'A|B|C|D' | awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  C   D

(これらの文字はすべて A B C D1文字で構成され、各文字はすべてのロケールで1バイトで構成され、各文字は単一の幅です。)

$ echo 'A|B|Ç|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç   D
$ echo 'A|B|Ç|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D

Ç(UTF-8では2バイト、幅1文字)

$ echo $'A|B|C\u0327|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D
$ echo $'A|B|C\u0327|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç D

1バイト、1幅Cと0幅、2バイト(UTF-8形式)が結合され、発音区別符号と結合され、1幅、2文字、3バイトグリフ、例で事前結合されたÇU+00C7以前の文字の分解バージョンをÇ

文字の表示幅を考慮するには、いくつかの実装expand(GNUではないexpand)を使用し、入力にTAB文字が含まれておらず、入力フィールドのいずれも割り当てられた幅を最初に超えないと仮定すると、次のことができます。

<input sed $'s/|/|\t/g;s/$/|\t/' | expand -t3,8,14,22 | sed 's/| //g' >output

出力は以下をprintf '%s\n' 'A|B|C|D' $'A|B|\uc7|D' $'A|B|C\u327|D'提供する必要があります。

AB  C   D
AB  Ç   D
AB  Ç   D

おすすめ記事