
Я обычно использую column
для преобразования входных данных в таблицу, например:
$ echo 'a\tb\tc\nd\te\tf' | column -t -s $'\t'
a b c
d e f
Однако он сворачивает пустые столбцы, например:
$ echo 'a\tb\tc\nd\t\tf' | column -t -s $'\t'
a b c
d f
Вместо того, чтобы печатать пустой столбец, когда есть последовательные разделители. Вот что я хотел бы, используя column
или иначе:
a b c
d f
решение1
Если вы используете GNU column
:
-н
По умолчанию команда column объединяет несколько смежных разделителей в один разделитель при использовании опции -t; эта опция отключает такое поведение. Эта опция является расширением Debian GNU/Linux.
printf 'a\tb\tc\nd\t\tf\n' | column -t -n -s $'\t'
Выход:
a b c
d f
Если GNU column
он недоступен, вы можете использовать sed для добавления пробела (или чего-то другого, например -
, ) между вкладками:
printf 'a\tb\tc\nd\t\tf\n' | sed -e ':loop; s/\t\t/\t-\t/; t loop' | column -t -s $'\t'
решение2
Я не смог найти опцию -n в моей версии команды column, поэтому исправил ее с помощью sed:
echo -e 'a\tb\tc\nd\t\tf' | sed 's/\t\t/\t \t/'| column -t -s $'\t'
решение3
Для тех, у кого нет столбца GNU (например, MacOS): будьте внимательны с первым и последним столбцом.Если первый столбец не самый длинный, то был бы сдвиг. Цикл в скрипте, похоже, не нужен. Предлагаю следующую трубу:| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t
paste \
<(printf "a\nb\nc") \
<(printf "1\n2\n3\n4444\n5\n6") \
<(printf "d\ne\nf\ng\nh\ni\nj\nijkl\nk\nl") \
<(printf "X") \
\
| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t
a 1 d X
b 2 e -
c 3 f -
- 4444 g -
- 5 h -
- 6 i -
- - j -
- - ijkl -
- - k -
- - l -