両方の変数列のデータを同じ形式で表示するにはどうすればよいですか?

両方の変数列のデータを同じ形式で表示するにはどうすればよいですか?

列形式のデータを表示するために、次のコードを書きました。

str1='hello i      am robert
and your ma frnd'

str2='thisisaverylongword thisistoohehehe andherefinishthe         string
hereis a other linefortheexample'

IFS=$'\n'
echo '----------------------'
echo 'STRING SHORT'
echo '----------------------'
echo "$str1" | column -t
echo
echo '----------------------'
echo 'STRING LONG'
echo '----------------------'
echo "$str2" | column -t

任意の出力:

----------------------
STRING SHORT
----------------------
hello  i     am  robert
and    your  ma  frnd

----------------------
STRING LONG
----------------------
thisisaverylongword  thisistoohehehe  andherefinishthe  string
hereis               a                other             linefortheexample

それでは、同じパターンを使用して文字列を書式設定しましょう。ただし、文字列をマージするわけではありません。

これが私が探している結果です:

----------------------
STRING SHORT
----------------------
hello                i                am                robert
and                  your             ma                frnd

----------------------
STRING LONG
----------------------
thisisaverylongword  thisistoohehehe  andherefinishthe  string
hereis               a                other             linefortheexample

それを行う方法についてのアイデアはありますか?フォーマットする前に文字列をマージして分割することもできますか?

これは単なる例であり、この特定のケースではなく一般的な解決策を探しています。

ベストアンサー1

あなたはする必要があります

printf "%s\n" "$str1" "$str2" | column -t

そしてそれからヘッダーの挿入

通常、配列を使用して次のように作成します。

strings=( "$str1" "$str2" ... )
headers=( "STRING SHORT" "STRING LONG" ... )

exec 3< <( printf "%s\n" "${strings[@]}" | column -t )
for (( i=0; i<${#strings[@]}; i++)); do
    printf -- "----\n%s\n----\n" "${headers[i]}"
    n=$(wc -l <<< "${strings[i]}")
    for (( j=1; j<=n; j++ )); do
        IFS= read -r line <&3
        echo "$line"
    done
    echo
done
exec 3<&-

メモ:

  • <( ... )カーニバルです。プロセスの交換。これはファイル名として扱われる汎用パイプです。これはパイプを使用すると非常に便利ですが、サブシェルでパイプの右側を実行することはできません。
  • ここでは、この「ファイル」からデータを読み取るためにファイル記述子#3を開きます。exec 3<file
  • read -r line <&3プロセス置換からデータ行を読み込む
  • exec 3<&-ファイル記述子を閉じる
  • ここでリダイレクトの詳細をご覧ください。http://www.gnu.org/software/bash/manual/bashref.html#Redirections
  • aを使用することもできましたが、printf ... | while read line; do ...; doneforループを使用すると計算が簡単になると思いました。

おすすめ記事