Как напечатать многострочные переменные в параллельных столбцах (bash)?

У меня есть две переменные, которые содержат многострочную информацию, и я хочу их столбец.

varA возвращает

Aug 01
Aug 04
Aug 16
Aug 26

и varB возвращает

04:25
07:28
03:39
10:06

, если я печатаю обе переменные, он возвращает

Aug01
Aug04
Aug16
Aug26
04:25
07:28
03:39
10:06

Что я хочу сделать следующее:

Aug01 04:25
Aug04 07:28
Aug16 03:39
Aug26 10:06

Я новичок в Linux, и я был бы признателен за некоторые советы, спасибо.

11
задан 18 August 2018 в 06:17

5 ответов

Встретиться paste, часть предварительно установленных утилит ядра GNU:

$ paste <(printf %s "$varA") <(printf %s "$varB")
Aug 01  04:25
Aug 04  07:28
Aug 16  03:39
Aug 26  10:06

paste берет файлы и не переменные, как введено, таким образом, я использовал bash Замена процесса и просто распечатанный переменное содержание с printf. Разделитель по умолчанию между столбцами TAB, можно изменить это с -d опция, например. paste -d" " для символа одиночного пробела. Узнать больше paste взгляните на руководство онлайн или работайте info '(coreutils) paste invocation'.

22
ответ дан 18 August 2018 в 06:17

Если вы просто хотите отобразить текстовые переменные рядом, @dessert предлагает самое простое (лучшее?) Решение с использованием print. Однако, если вы хотите иметь возможность манипулировать каждой частью по отдельности, вы можете вместо этого легко преобразовать переменные в массивы и пройти через них.

#!/bin/bash

# declare the multi-line variables
var1="1
2
3
4"
var2="a
b
c
d"

# backup internal field separator to be safe
IFSave=$IFS

# set IFS to newline so vars will use newline to split into array
IFS=\n'

# split variables into array
foo=($var1)
bar=($var2)

#restore IFS to original value to be safe
IFS=$IFSave

# loop array foo, and cross reference key in array bar
for i in "${!foo[@]}"; do 
  printf "${foo[$i]} : ${bar[$i]}\n"
done

# you can allso now print single corresponding lines:
line=3

let id=$line-1 # arrays start at 0, so need to remove one

printf "\nPrinting line number $line\n"
printf "${foo[$id]} : ${bar[$id]}\n"
8
ответ дан 18 August 2018 в 06:17

Вы можете сделать это с помощью инструмента POSIX pr:

varA='Aug 01
Aug 04
Aug 16
Aug 26'
varB='04:25
07:28
03:39
10:06'
pr -2 -t <<eof
$varA
$varB
eof

Результат:

Aug 01                              04:25
Aug 04                              07:28
Aug 16                              03:39
Aug 26                              10:06

Или для одной вкладки:

pr -2 -t -s

Или для одного пробела:

pr -2 -t -s' '

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html

Или с column из пакет util-linux:

column -c 20 <<eof
$varA
$varB
eof
4
ответ дан 18 August 2018 в 06:17

paste используемый с column обеспечивает чистый вывод. Для удобства большинства пользователей я буду использовать пример каталогов уже в их системе.

$ cd /sys/devices/system/cpu/cpu0/cpufreq

$ ls
affected_cpus                             energy_performance_preference  scaling_governor
cpuinfo_max_freq                          related_cpus                   scaling_max_freq
cpuinfo_min_freq                          scaling_available_governors    scaling_min_freq
cpuinfo_transition_latency                scaling_cur_freq               scaling_setspeed
energy_performance_available_preferences  scaling_driver

$ cat *
0
3500000
800000
4294967295
default performance balance_performance balance_power power 
balance_performance
0
performance powersave
875982
intel_pstate
powersave
3500000
800000
<unsupported>

$ paste <(ls *) <(cat *) | column -s  

Без эти column команда, поля во втором столбце не выравниваются, делая более трудным читать.

$ paste <(ls *) <(cat *)
affected_cpus   0
cpuinfo_max_freq    3500000
cpuinfo_min_freq    800000
cpuinfo_transition_latency  4294967295
energy_performance_available_preferences    default performance balance_performance balance_power power 
energy_performance_preference   balance_performance
related_cpus    0
scaling_available_governors performance powersave
scaling_cur_freq    1943068
scaling_driver  intel_pstate
scaling_governor    powersave
scaling_max_freq    3500000
scaling_min_freq    800000
scaling_setspeed    <unsupported>
<час>

Для больше column примеры команды видят эту статью: Просмотр вывод Linux в столбцах

, Если эти column команда уже не установлена использование:

sudo apt update
sudo apt install util-linux
\t' -t affected_cpus 0 cpuinfo_max_freq 3500000 cpuinfo_min_freq 800000 cpuinfo_transition_latency 4294967295 energy_performance_available_preferences default performance balance_performance balance_power power energy_performance_preference balance_performance related_cpus 0 scaling_available_governors performance powersave scaling_cur_freq 1079503 scaling_driver intel_pstate scaling_governor powersave scaling_max_freq 3500000 scaling_min_freq 800000 scaling_setspeed <unsupported>

Без эти column команда, поля во втором столбце не выравниваются, делая более трудным читать.

$ paste <(ls *) <(cat *)
affected_cpus   0
cpuinfo_max_freq    3500000
cpuinfo_min_freq    800000
cpuinfo_transition_latency  4294967295
energy_performance_available_preferences    default performance balance_performance balance_power power 
energy_performance_preference   balance_performance
related_cpus    0
scaling_available_governors performance powersave
scaling_cur_freq    1943068
scaling_driver  intel_pstate
scaling_governor    powersave
scaling_max_freq    3500000
scaling_min_freq    800000
scaling_setspeed    <unsupported>
<час>

Для больше column примеры команды видят эту статью: Просмотр вывод Linux в столбцах

, Если эти column команда уже не установлена использование:

sudo apt update
sudo apt install util-linux
-1
ответ дан 23 September 2019 в 05:49

Если бы Вы хотели избежать внешних утилит и сделать это исходно в оболочке, то Вы могли использовать read с отдельными дескрипторами файлов / здесь представляет в виде строки для каждой переменной:

while IFS= read -r -u3 a && read -r -u4 b; do 
  printf '%s\t%s\n' "$a" "$b"
done 3<<<"$varA" 4<<<"$varB"
Aug 01  04:25
Aug 04  07:28
Aug 16  03:39
Aug 26  10:06

Хотя это часто полагало, что плохая практика использует оболочку для обработки текста, это могло бы быть извинено в случае, что у Вас уже есть данные в переменных оболочки.

3
ответ дан 23 November 2019 в 03:51

Другие вопросы по тегам:

Похожие вопросы: