如何在 bash 中并排打印多行变量?

如何在 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,希望得到一些建议。

答案1

Meetpaste是预装的一部分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'

答案2

如果您只想并排显示文本变量,@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"

答案3

您可以使用 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

如果您想要避免使用外部实用程序并在 shell 中本地执行此操作,则可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

尽管使用 shell 进行文本处理通常被认为是不好的做法,但如果您已经在 shell 变量中拥有数据,那么这种做法可能是可以原谅的。

相关内容