echoまたはprintを使用して複数行を並べ替える方法

echoまたはprintを使用して複数行を並べ替える方法

fstabの下にリストされているエントリに基づいてマウントされたファイルシステムを確認するスクリプトがあります。ここで直面する問題は、出力を整列したままにすることです。

以下はスクリプト出力です。

/  is mounted OK
/boot  is mounted OK
/was8  is mounted OK
/was8/slogs  is mounted OK
/was8/cluster  is mounted OK
/was8/working  is mounted OK
/was8/app  is mounted OK
/was8/tools  is mounted OK
/was8/plugin  is mounted OK
/was8/coreproduct  is mounted OK
...

線を整列したままにしたいので、次のようにする必要があります。

/  is mounted                       OK
/boot  is mounted                   OK
/was8  is mounted                   OK
/was8/slogs  is mounted             OK
/was8/cluster  is mounted           OK
/was8/working  is mounted           OK
/was8/app  is mounted               OK
/was8/tools  is mounted             OK
/was8/plugin  is mounted            OK
/was8/coreproduct  is mounted       OK
...

列とxargsを試しましたが、目的の結果を取得できませんでした。誰か私を助けてください。

答え1

通常、印刷するときに書式文字列の幅をprintf。文字列は、オーバーフローしない限り、20文字(*)幅のフィールドに印刷されます。%-20s20文字にしてオーバーフローを削除します。%-20.20s

(*例えば、Bashはprintf本当に重要ですが、バイト。違いはUTF-8などの文字で確認できますä。 )

例えば

printf "%-40s %s\n" "$mountpoint  is mounted" "$status"

最初の部分の幅は(少なくとも)40文字です。

/was8/coreproduct  is mounted            OK
...

または、これらの入力を後処理する必要がある場合は、Perlまたはawkを使用できます。

perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e'  < file

awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}'  < file

両方とも、デフォルトでは空白ではなく最後の文字列を分離し、固定幅フィールドの最初の部分と一緒に2つの部分を印刷します。


あるいは、フィールド間の区別をまったく同じに保つことを気にしなければ、@はより簡単な解決策に注釈を付けました。ジョアオする:

awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file

これにより、次のような出力が生成されます。以前の2つのスペースがis mounted1つに縮小されました。これは、awkフィールドが変更されたときにフィールド全体が再作成されるために発生します。$0NF

/was8/coreproduct is mounted             OK

答え2

混乱したPerl:

perl -ne 'printf "%-40s %s", /(.*) (.*)/s'

答え3

1つの方法は、ステータスコードの前にタブを追加することです。たとえば、次のようになります。

<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t

出力:

/  is mounted                        OK
/boot  is mounted                    OK
/was8  is mounted                    OK
/was8/slogs  is mounted              OK
/was8/cluster  is mounted            OK
/was8/working  is mounted            OK
/was8/app  is mounted                OK
/was8/tools  is mounted              OK
/was8/plugin  is mounted             OK
/was8/coreproduct  is mounted        OK
/was8/ihs  is mounted                OK
/was8/backup  is mounted             OK
/was8/ihs/logs  is mounted           OK
/was8/wsdm  is mounted               OK
/was8/ws  is mounted                 OK
/was8/ihs/logs/analysis  is mounted  OK

答え4

これは、列ユーティリティを使用して簡単に行うこともできます。鍵となるのは、「列」の間に一種の区別表示を含めることです。たとえば、スペースが区別されるマーカーであれば、column -s ' ' -o ' ' -t空間的に完全に整列します。

私はそれをたくさん使用し、私のコードをソートするために使用する素晴らしいvimマクロを作成しました。必要な一般的な構文は次のとおりです。

column -s <Separator String> -o <Separator String in Output> -t

これはタブベースの回答を一般化したものですが、必ずしもタブを挿入する必要はありません。

関連情報