5

次の出力を生成したいと思います。

> Avril Stewart  99  54
> Sally Kinghorn 170 60
> John Young     195 120
> Yutte Schim... 250 40

ご覧のとおり、14 文字未満の名前にはスペースが埋め込まれています。15 文字を超える名前は切り捨てられます。「Yutte Schimmelpenninck」は「Yutte Schim...」に切り捨てられます。

これを達成するために私が試みたのは次のとおりです(変数$name$height、および$weightはファイルから抽出され、ループはprintf各ファイルデータに対してコマンドを実行します):

printf '%-14s -%3s -%3s\n' "$name" "$height" "$weight"
> Avril Stewart  99  54
> Sally Kinghorn 170 60
> John Young     195 120
> Yutte Schimmelpenninck 250 40

printfワンライナーが望ましいソリューションです。

出力の最初のブロックを生成するコードは?

4

3 に答える 3

9

コマンドの前にprintf、名前が 14 文字を超えているかどうかを確認し、14 文字を超えている場合は切り捨てて、最後の 3 文字をドットに置き換えます。このコマンドは次のことを行います。

(( ${#name} > 14 )) && name="${name:0:11}..."

name最初の 11 文字に置き換えて、 を追加し...ます。

フォーマット文字列も修正する必要がありprintfます。代わりに

'%-14s -%3s -%3s\n'

そうでなければならない

'%-14s %-3s -%-3s\n'

または、次のような結果が得られます

Avril Stewart  - 99 - 54

ただし、出力例にはハイフンが含まれていなかったため、単なるタイプミスだった可能性があります。

概して:

$ name='Avril Stewart'; weight=99; height=54
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Avril Stewart  99  54
$ name='Sally Kinghorn'; weight=170; height=60
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Sally Kinghorn 170 60
$ name='Yutte Schimmelpeninck'; weight=250; height=40
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Yutte Schim... 250 40

したがって、これをファイルから読み取ると、たとえばカンマ区切りで、次のようなループになります。

while IFS=, read -r name weight height; do
    (( ${#name} > 14 )) && name="${name:0:11}..."
    printf '%-14s %-3s %-3s\n' "$name" $weight $height
done < inputFile

その結果

Avril Stewart  99  54
Sally Kinghorn 170 60
John Young     195 120
Yutte Schim... 250 40

ワンライナーでは無理だと思います。三項演算子を試して、次のようなものを試しました

printf '%s\n' $(( ${#name} > 14 ? "${name:0:11}..." : "$name" ))

ただし、ここでの問題は、整数に対してのみ機能し、文字列は算術コンテキストでゼロに展開されることです。

于 2016-03-21T00:48:08.833 に答える
6

より慣用的なawkバージョンは

$ awk        '{v=$1 FS $2} 
  length(v)>14{v=substr(v,1,11)"..."}
              {printf "%-15s %-3d %-3d\n",v,$3,$4}' file     

Avril Stewart  99  54 
Sally Kinghorn 170 60 
John Young     195 120
Yutte Schim... 250 40

%-3dの記号を削除する-と、数値は通常どおり右揃えになりますが、これは要求した形式です。

于 2016-03-21T01:00:02.723 に答える