Bash Таблицы вывода
Я хочу вывести текст в формате таблицы. То, что я пытался сделать, это эхо-элементы массива с "\ t", но он был смещен.
мой код
for((i=0;i<array_size;i++));
do
echo stringarray[$i] $'\t' numberarray[$i] $'\t' anotherfieldarray[$i]
done;
Мой вывод
a very long string.......... 112232432 anotherfield
a smaller string 123124343 anotherfield
Требуемый вывод
a very long string.......... 112232432 anotherfield
a smaller string 123124343 anotherfield
Ответы
Ответ 1
printf
- удивительная небольшая программа, которую многие люди забывают. Это довольно мощный.
$ for num in 1 10 100 1000 10000 100000 1000000; do printf "%10s %s\n" $num "foobar"; done
1 foobar
10 foobar
100 foobar
1000 foobar
10000 foobar
100000 foobar
1000000 foobar
$ for((i=0;i<array_size;i++));
do
printf "%10s %10d %10s" stringarray[$i] numberarray[$i] anotherfieldarray[%i]
done
Примечание. Я использовал %10s
для строк. %s
- важная часть. Он сообщает ему использовать строку. 10
в середине говорит, сколько столбцов оно должно быть. %d
для цифр (цифр).
man 1 printf
для получения дополнительной информации.
Ответ 2
Используйте команду столбца:
column -t -s' ' filename
Ответ 3
Чтобы иметь тот же самый результат, который вам нужен, вам нужно отформатировать файл следующим образом:
a very long string..........\t 112232432\t anotherfield\n
a smaller string\t 123124343\t anotherfield\n
И затем используя:
$ column -t -s $'\t' FILE
a very long string.......... 112232432 anotherfield
a smaller string 123124343 anotherfield
Ответ 4
Не знаете, где вы это делали, но код, который вы опубликовали, не выдавал результат, который вы дали, по крайней мере, не в bash, с которым я знаком.
Попробуйте это вместо:
stringarray=('test' 'some thing' 'very long long long string' 'blah')
numberarray=(1 22 7777 8888888888)
anotherfieldarray=('other' 'mixed' 456 'data')
array_size=4
for((i=0;i<array_size;i++))
do
echo ${stringarray[$i]} $'\x1d' ${numberarray[$i]} $'\x1d' ${anotherfieldarray[$i]}
done | column -t -s$'\x1d'
Обратите внимание, что я использую символ seperator группы (1d) вместо вкладки, потому что, если вы получаете эти массивы из файла, они могут содержать вкладки.
Ответ 5
Это легче, чем вам интересно.
Если вы также работаете с разделенным символом с запятой и заголовком:
$ (head -n1 file.csv && sort file.csv | grep -v <header>) | column -s";" -t
Если вы работаете с массивом (используя вкладку как разделитель):
for((i=0;i<array_size;i++));
do
echo stringarray[$i] $'\t' numberarray[$i] $'\t' anotherfieldarray[$i] >> tmp_file.csv
done;
cat file.csv | column -t