Я хочу вывести текст в табличном формате. Я пытался повторить элементы массива с помощью '\ 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
%-10s
будет генерировать выровненные по левому краю строки длиной 10Используйте команду столбца:
column -t -s' ' filename
источник
%s
спецификатор формата принимает в качестве разделителя пробел. В этом случае ни один из ответов здесь не сработает. Меня удивляет, что вы постоянно говорите о желаемом выходе, когда синтаксический анализ (с использованием любого инструмента) зависит от разделителя ввода.cat /etc/fstab | sed -r 's/\s+/ /g' | column -t -s' '
Чтобы получить тот же результат, что и вам нужно, вам нужно отформатировать файл следующим образом:
А затем используя:
$ column -t -s $'\t' FILE a very long string.......... 112232432 anotherfield a smaller string 123124343 anotherfield
источник
$
в$'\t'
делать?function printTable() { local -r delimiter="${1}" local -r data="$(removeEmptyLines "${2}")" if [[ "${delimiter}" != '' && "$(isEmptyString "${data}")" = 'false' ]] then local -r numberOfLines="$(wc -l <<< "${data}")" if [[ "${numberOfLines}" -gt '0' ]] then local table='' local i=1 for ((i = 1; i <= "${numberOfLines}"; i = i + 1)) do local line='' line="$(sed "${i}q;d" <<< "${data}")" local numberOfColumns='0' numberOfColumns="$(awk -F "${delimiter}" '{print NF}' <<< "${line}")" # Add Line Delimiter if [[ "${i}" -eq '1' ]] then table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")" fi # Add Header Or Body table="${table}\n" local j=1 for ((j = 1; j <= "${numberOfColumns}"; j = j + 1)) do table="${table}$(printf '#| %s' "$(cut -d "${delimiter}" -f "${j}" <<< "${line}")")" done table="${table}#|\n" # Add Line Delimiter if [[ "${i}" -eq '1' ]] || [[ "${numberOfLines}" -gt '1' && "${i}" -eq "${numberOfLines}" ]] then table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")" fi done if [[ "$(isEmptyString "${table}")" = 'false' ]] then echo -e "${table}" | column -s '#' -t | awk '/^\+/{gsub(" ", "-", $0)}1' fi fi fi } function removeEmptyLines() { local -r content="${1}" echo -e "${content}" | sed '/^\s*$/d' } function repeatString() { local -r string="${1}" local -r numberToRepeat="${2}" if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]] then local -r result="$(printf "%${numberToRepeat}s")" echo -e "${result// /${string}}" fi } function isEmptyString() { local -r string="${1}" if [[ "$(trimString "${string}")" = '' ]] then echo 'true' && return 0 fi echo 'false' && return 1 } function trimString() { local -r string="${1}" sed 's,^[[:blank:]]*,,' <<< "${string}" | sed 's,[[:blank:]]*$,,' }
ЗАПУСК ОБРАЗЦА
$ cat data-1.txt HEADER 1,HEADER 2,HEADER 3 $ printTable ',' "$(cat data-1.txt)" +-----------+-----------+-----------+ | HEADER 1 | HEADER 2 | HEADER 3 | +-----------+-----------+-----------+ $ cat data-2.txt HEADER 1,HEADER 2,HEADER 3 data 1,data 2,data 3 $ printTable ',' "$(cat data-2.txt)" +-----------+-----------+-----------+ | HEADER 1 | HEADER 2 | HEADER 3 | +-----------+-----------+-----------+ | data 1 | data 2 | data 3 | +-----------+-----------+-----------+ $ cat data-3.txt HEADER 1,HEADER 2,HEADER 3 data 1,data 2,data 3 data 4,data 5,data 6 $ printTable ',' "$(cat data-3.txt)" +-----------+-----------+-----------+ | HEADER 1 | HEADER 2 | HEADER 3 | +-----------+-----------+-----------+ | data 1 | data 2 | data 3 | | data 4 | data 5 | data 6 | +-----------+-----------+-----------+ $ cat data-4.txt HEADER data $ printTable ',' "$(cat data-4.txt)" +---------+ | HEADER | +---------+ | data | +---------+ $ cat data-5.txt HEADER data 1 data 2 $ printTable ',' "$(cat data-5.txt)" +---------+ | HEADER | +---------+ | data 1 | | data 2 | +---------+
REF LIB по адресу: https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash
источник
-e
параметр в командах echo, чтобы тире печатались правильно.Это проще, чем вы думаете.
Если вы работаете с файлом, разделенным точкой с запятой, и заголовком:
$ (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
источник
awk
решение, которое имеет дело со стандартным вводомПоскольку
column
это не POSIX, возможно, это:mycolumn() ( file="${1:--}" if [ "$file" = - ]; then file="$(mktemp)" cat > "${file}" fi awk ' FNR == 1 { if (NR == FNR) next } NR == FNR { for (i = 1; i <= NF; i++) { l = length($i) if (w[i] < l) w[i] = l } next } { for (i = 1; i <= NF; i++) printf "%*s", w[i] + (i > 1 ? 1 : 0), $i print "" } ' "$file" "$file" if [ "$1" = - ]; then rm "$file" fi )
Контрольная работа:
printf '12 1234 1 12345678 1 123 1234 123456 123456 ' > file
Команды тестирования:
Выход для всех:
Смотрите также:
источник
if [ "$file" = - ]; then
конце должно бытьif [ "$1" = - ]; then
. С текущим кодом вы никогда не очистите свои временные файлы.Не уверен, где вы это запускали, но опубликованный вами код не будет выдавать результат, который вы дали, по крайней мере, в 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'
Обратите внимание, что я использую символ разделителя групп (1d) вместо вкладки, потому что, если вы получаете эти массивы из файла, они могут содержать вкладки.
источник
На всякий случай, если кто-то захочет сделать это на PHP, я опубликовал суть на Github
https://gist.github.com/redestructa/2a7691e7f3ae69ec5161220c99e2d1b3
просто позвоните:
$output = $tablePrinter->printLinesIntoArray($items, ['title', 'chilProp2']);
вам может потребоваться адаптировать код, если вы используете версию php старше 7.2
после этого вызовите echo или writeLine в зависимости от вашей среды.
источник
Код ниже был протестирован и выполняет именно то, что требуется в исходном вопросе.
Параметры:% 30s Столбец из 30 знаков и выравнивание текста по правому краю. % 10d целочисленное обозначение,% 10s также будет работать. Добавлены пояснения к комментариям к коду.
stringarray[0]="a very long string.........." # 28Char (max length for this column) numberarray[0]=1122324333 # 10digits (max length for this column) anotherfield[0]="anotherfield" # 12Char (max length for this column) stringarray[1]="a smaller string....." numberarray[1]=123124343 anotherfield[1]="anotherfield" printf "%30s %10d %13s" "${stringarray[0]}" ${numberarray[0]} "${anotherfield[0]}" printf "\n" printf "%30s %10d %13s" "${stringarray[1]}" ${numberarray[1]} "${anotherfield[1]}" # a var string with spaces has to be quoted printf "\n Next line will fail \n" printf "%30s %10d %13s" ${stringarray[0]} ${numberarray[0]} "${anotherfield[0]}" a very long string.......... 1122324333 anotherfield a smaller string..... 123124343 anotherfield
источник