Bash

如何以相同格式在兩個變數的列中顯示數據?

  • March 25, 2014

我編寫了以下程式碼以顯示按列格式化的數據:

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

你有什麼想法嗎?可能是在格式化之前合併字元串並拆分它?

請注意,這只是一個範例,我正在尋找一個通用解決方案,而不僅僅是針對這種特定情況。

你不得不

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<&-

筆記:

  • <( ... )是一個 bash程序替換。這是一個作為文件名處理的普通管道。在您將使用管道但不能在子shell中執行管道右側的情況下,這非常方便。
  • 在這裡,我們打開文件描述符#3 來從這個“文件”中讀取數據:exec 3<file
  • read -r line <&3從程序替換中讀取一行數據
  • exec 3<&-關閉文件描述符
  • 在此處閱讀有關重定向的更多資訊:http ://www.gnu.org/software/bash/manual/bashref.html#Redirections
  • 我本可以使用 aprintf ... | while read line; do ...; done但我認為 for 循環會使計數更容易。

引用自:https://unix.stackexchange.com/questions/121039