各フィールドに末尾のスペースを追加したいと思います。私のファイルは次のとおりです。
入力ファイル:
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
D
1文字で構成され、各文字はすべてのロケールで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