Подтвердить что ты не робот

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
4b9b3361

Ответ 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