У меня есть две переменные, которые содержат многострочную информацию, и я хочу их столбец.
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, и я был бы признателен за некоторые советы, спасибо.
Встретиться 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'
.
Если вы просто хотите отобразить текстовые переменные рядом, @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"
Вы можете сделать это с помощью инструмента 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
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
Если бы Вы хотели избежать внешних утилит и сделать это исходно в оболочке, то Вы могли использовать 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
Хотя это часто полагало, что плохая практика использует оболочку для обработки текста, это могло бы быть извинено в случае, что у Вас уже есть данные в переменных оболочки.