列形式のデータを表示するために、次のコードを書きました。
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 ...; done
forループを使用すると計算が簡単になると思いました。