בואו נסדר טקסט בטבלה עם הפקודה column

15/10/2023

הפקודה column נועדה כדי לקבל טקסט ארוך ולשבור אותו לעמודות כדי שיהיה קל יותר לקרוא אותו בלי לגלול, כמו טורים בדף של עיתון. אפשר לראות דוגמה קלה לשימוש בה כשנעביר אליה תוכן של קובץ. כך נראה הקובץ /etc/shells אצלי:

$ cat /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/pwsh

וכך זה נראה עם column:

$ cat /etc/shells | column

# List of acceptable shells for chpass(1).                      /bin/csh                                                        /bin/tcsh
# Ftpd will not allow users to connect who are not using        /bin/dash                                                       /bin/zsh
# one of these shells.                                          /bin/ksh                                                        /usr/local/bin/pwsh
/bin/bash                                                       /bin/sh

אבל ל column יש שימוש נוסף אפילו יותר מעניין - המתג -t שלו גורם לפקודה לזהות קלט שמחולק לעמודות ולהדפיס בצורה יפה (כלומר מרווחת) קלט זה. לדוגמה ניקח את תוכנית ה bash הבאה שמדפיסה את לוח הכפל, בלי לסדר יפה את הפלט:

#!/bin/bash

end=${1:-10}

for ((i=1; i <= $end; i++))
do
  for ((j=1; j <= $end; j++))
  do
    printf "%d " $((i * j))
  done
  echo
done

ברירת המחדל היא להדפיס עד 10 אבל אפשר להעביר פרמטר כדי לקבל לוחות גדולים יותר. ונכון אפשר להתאים את ה printf כדי שהפלט יודפס מרווח יפה במקרה הזה אבל אנחנו רוצים לדבר על column. הפעלה רגילה של התוכנית מדפיסה:

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

התוספת של column -t כבר עושה את הקסם:

$ bash table.bash | column -t

1   2   3   4   5   6   7   8   9   10
2   4   6   8   10  12  14  16  18  20
3   6   9   12  15  18  21  24  27  30
4   8   12  16  20  24  28  32  36  40
5   10  15  20  25  30  35  40  45  50
6   12  18  24  30  36  42  48  54  60
7   14  21  28  35  42  49  56  63  70
8   16  24  32  40  48  56  64  72  80
9   18  27  36  45  54  63  72  81  90
10  20  30  40  50  60  70  80  90  100

דבר אחד שאולי מציק כאן זה היישור לשמאל. בגירסת ה BSD של column שמותקנת אצלי על המק צריך פשוט לחיות עם זה, אבל בלינוקס המתג -R0 גורם ליישור הטבלה כולה לימין וזה נראה כך:

ubuntu@primary:~/Home/tmp/blog$ bash table.bash |column -t -R0
 1   2   3   4   5   6   7   8   9   10
 2   4   6   8  10  12  14  16  18   20
 3   6   9  12  15  18  21  24  27   30
 4   8  12  16  20  24  28  32  36   40
 5  10  15  20  25  30  35  40  45   50
 6  12  18  24  30  36  42  48  54   60
 7  14  21  28  35  42  49  56  63   70
 8  16  24  32  40  48  56  64  72   80
 9  18  27  36  45  54  63  72  81   90
10  20  30  40  50  60  70  80  90  100