
各フィールドに末尾のスペースを追加したいと思います。私のファイルは次のとおりです。
入力ファイル:
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
答え2
bash
シェル関数のみを使用してください...
提供されたサンプルデータの場合:
$ foo="A|B|C|D"; printf "%s%s %s %s \n" $(echo -e "${foo//|/ }" )
AB C D
$ foo="A|B|C\u0327|D"; printf "%s%s %s %s \n" $(echo -e "${foo//|/ }" )
AB Ç D
質問ごとの固定フィールド出力の場合、指定された最大幅を超える入力フィールドがないとします。
$ foo="A|B|C|D"; printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" )
AB C D
次のマルチバイト文字の場合:(Ç
シェル組み込みおよびスタンドアロンユーティリティ)の幅指定子は、マルチバイト文字ではなくバイトを計算します。したがって、「予期しない」出力が表示されることがあります。printf
bash
$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" )
AB Ç D
$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" ) | xxd
00000000: 4142 2020 c387 2020 4420 2020 2020 0a AB .. D .
$